POJ 2594 Treasure Exploration floyd+最小路径覆盖
http://poj.org/problem?id=2594
题意:N个点组成的有向无环图,每个点可以重复到达,问至少派几个机器人可以走完所有的点,点可以重复到达,
还以为跟1422一模一样呢,还奇怪了,弄两个一样的题,非也。poj 1422的每个点只能走一次,所以用最小
路径覆盖,这个题,每个点可以重复走,用floyd传递闭包,好吧,传递闭包代码好像简单,但是原理还要学的
代码:
#include<iostream> #include<cstdio> #include<string> #include<cstring> using namespace std; int link[505]; bool vis[505],map[505][505]; int n; bool dfs(int u) { for(int i=1;i<=n;i++) { if(map[u][i]&&!vis[i]) { vis[i]=1; if(!link[i]||dfs(link[i])) { link[i]=u; return 1; } } } return 0; } int MaxMatch() { int SUM=0; memset(link,0,sizeof(link)); for(int i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); if(dfs(i))SUM++; } return SUM; } int main() { int i,j,k,m; while(~scanf("%d%d",&n,&m)) { if(n==0&&m==0)break; memset(map,0,sizeof(map)); while(m--) { scanf("%d%d",&i,&j); map[i][j]=1; } //传递闭包 for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(map[i][k]&&map[k][j])map[i][j]=1; int ans=MaxMatch(); printf("%d\n",n-ans); } return 0; }