这道题是让求派出机器人的最少数量,乍一看以为是简单的求最小路径覆盖,后来发现错了,因为有的点可以走多次,而二分中每个点只能走一次,所以要先用floyd进行传递闭包,然后用二分
#include<stdio.h> #include<string.h> #define N 505 int match[N],visit[N]; int n,m; int g[N][N]; int DFS(int u) { int i; for(i=1;i<=n;i++) if(!visit[i]&&g[u][i]) { visit[i]=1; if(match[i]==-1||DFS(match[i])) { match[i]=u; return 1; } } return 0; } int maxMatch() { memset(match,-1,sizeof(match)); int ans=0,i; for(i=1;i<=n;i++) { memset(visit,0,sizeof(visit)); if(DFS(i)) ans++; } return ans; } void Floyd() { for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(g[i][k] && g[k][j]) g[i][j]=1; } int main() { int a,b; while(scanf("%d%d",&n,&m)) { memset(g,0,sizeof(g)); if((n+m)==0) break; for(int i=0;i<m;i++) { scanf("%d%d",&a,&b); g[a][b]=1; } Floyd(); printf("%d ",n-maxMatch()); } return 0; }