1422:Air Raid

keyword

最小パス被覆 C++

概要

ノード数N(<120)のDAGが与えられる。最小パス被覆を計算する問題。
模擬地区予選で類題が出た問題。DAGの最小パス被覆は(u,v)に対してu->v'となるような2部グラフの最大マッチングを頂点数から引けば良い。

int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        for(int i=0; i<300; i++)
            G[i].clear();
        int E;
        scanf("%d%d",&V,&E);
        for(int i=0; i<150; i++)
            for(int j=0; j<150; j++)
                graph[i][j] = false;
        for(int i=0; i<E; i++){
            int x, y;
            scanf("%d%d",&x,&y);
            graph[x-1][y-1] = true;
        }
        for(int i=0; i<V; i++)
            for(int j=0; j<V; j++)
                if(i!=j && graph[i][j])
                    add_edge(i,j+V);
        V *= 2;
        printf("%d\n",(V>>1)-bipartite_matching());
    }
    return 0;
}