首页 > 代码库 > Bipartitegraph1442
Bipartitegraph1442
题意:
派一些伞兵去那个镇里,要到达所有的路口,有一些或者没有伞兵可以不去那些路口,只要其他人能完成这个任务。
每个在一个路口着陆了的伞兵可以沿着街去到其他路口。我们的任务是求出去执行任务的伞兵最少可以是多少个。
一个最小路径覆盖的问题:
路口是节点,街道是有向边
最小路径覆盖 = 顶点数 – 二分最大匹配数。
/*
Problem: 1422 User: CSU_ACM1174
Memory: 188K Time: 0MS
Language: C++ Result: Accepted
*/
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define MAXN 125
bool map[MAXN][MAXN], vis[MAXN];
int link[MAXN];
int inter, k;
bool dfs( int u)
{
int v;
for( v = 1; v <= inter; v ++)
if( map[u][v] && !vis[v])
{
vis[v] = true;
if( link[v] == -1 || dfs( link[v]))
{
link[v] = u;
return true;
}
}
return false;
}
int MaxMatch()
{
int u, ret = 0;
memset( link, -1, sizeof link);
for( u = 1; u <= inter; u ++)
{
memset( vis, false, sizeof vis);
if( dfs(u)) ret ++;
}
return ret;
}
int main()
{
int cas;
scanf( "%d", &cas);
while( cas --)
{
scanf( "%d%d", &inter, &k);//路口数,街道数
memset( map, false, sizeof map);
for( int i = 1; i <= k; i ++)
{
int x, y;
scanf( "%d%d", &x, &y);
map[x][y] = true;
}
int ans = MaxMatch();
printf( "%d\n", inter - ans);// 最小路径覆盖 = 顶点数 – 二分最大匹配数。
}
return 0;
}
Bipartitegraph1442