题目意思:就是给你一张有向图,问你最少需要多少个机器人去访问所有的点 思路:这个题是一个最小路径覆盖,但这个题里的点是可以走多次的,所以直接建的图还需要用floyd求一下传递闭包 /* * File: main.cpp * Author: Mi * * Created on 2011年3月10日, 下午2:56 */ #include <cstdlib> #include <stdio.h> #include <string.h> #define N 505 /* * */ int map[N][N],link[N],n,m; bool used[N]; bool dfs(int u) { for(int i=1;i<=n;i++) { if(map[u][i]&&!used[i]) { used[i]=true; if(link[i]==-1||dfs(link[i])) { link[i]=u; return true; } } } return false; } void floyd() { int i,j,k; 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 main(int argc, char** argv) { int i; while(scanf("%d%d",&n,&m)&&(n||m)) { memset(map,0,sizeof(map)); memset(link,-1,sizeof(link)); for(i=1;i<=m;i++) { int a,b; scanf("%d%d",&a,&b); map[a][b]=1; } floyd(); int ans=0; for(i=1;i<=n;i++) { memset(used,0,sizeof(used)); if(dfs(i)) ans++; } printf("%d/n",n-ans); } return 0; }