您的位置:首页 > 大数据 > 人工智能

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

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

代码:

#include <cstdio>
#include <cstring>

const int N = 150;
int n, m;
int bmap

, cy
;
bool vis
;

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());
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: