IT民工
加油!

http://poj.org/problem?id=1422

题意:

派一些伞兵去那个镇里,要到达所有的路口,有一些或者没有伞兵可以不去那些路口,只要其他人能完成这个任务。

每个在一个路口着陆了的伞兵可以沿着街去到其他路口。我们的任务是求出去执行任务的伞兵最少可以是多少个。

一个路径覆盖的问题:

 

在一个有向图中,路径覆盖就是在图中找一些路径,使之覆盖了图中的所有顶点,且任何一个顶点有且只有一条路

径与之关联;(如果把这些路径中的每条路径从它的起始点走到它的终点,那么恰好可以经过图中的每个顶点一次

且仅一次);同样是求出二分图最大匹配数,代码和刚才的差不多,有这样一个公式 

       //最小路径覆盖 = 顶点数 – 最大匹配数。

 

 

/*
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;
}


 

posted on 2012-04-03 16:48  找回失去的  阅读(410)  评论(0编辑  收藏  举报