HDU 1151 Air Raid( 最小路径覆盖 )

来源:互联网 发布:国家旅游局2015年数据 编辑:程序博客网 时间:2024/05/28 05:16

这道题是很经典的最小路径覆盖问题。最小路径覆盖,是指在有向无环图中,选择最少的点作为起点,使得遍历图中所有的点有且仅有一次。因此,每个单独的顶点可以看做是一条路径。最小路径覆盖=N-原图的最大二分匹配数。

代码:

#include <cstdio>#include <cstring>const int N = 150;int n, m;int bmap[N][N], cy[N];bool vis[N];bool dfs( int u ) {    for( int i = 1; i <= n; ++i ) if ( bmap[u][i] && !vis[i] ) {        vis[i] = 1;        if ( cy[i] == -1 || dfs( cy[i] )) {            cy[i] = u;            return 1;        }    }    return 0;}int match(){    int res = 0;     memset( cy, -1, sizeof(cy));    for ( int i = 1; i <= n; ++i ) {        memset( vis, 0, sizeof(vis));        if ( dfs(i) ) res++;    }    return res;}int main(){    int T;    scanf("%d", &T);    while ( T-- ) {        scanf("%d%d", &n, &m);        memset(bmap, 0, sizeof(bmap));        while ( m-- ) {            int u, v;            scanf("%d%d", &u, &v);            bmap[u][v] = 1;        }        printf("%d\n", n - match());    }}


原创粉丝点击