标签:space 一个 pre std cstring max main nbsp while
二分图最小路径覆盖=顶点数-最大匹配数。这里还要跑个floyd,因为一个点可以走两遍,匹配的数目可以再增加。
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <queue> using namespace std; const int maxn=500+100; int g[maxn][maxn]; int gg[maxn]; int vis[maxn]; int n,m; void flood() { 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; } bool dfs_x(int x) { for(int i=1;i<=n;i++) if(!vis[i]&&g[x][i]) { vis[i]=1; if(!gg[i]||dfs_x(gg[i])) { gg[i]=x; return true; } } return false; } int main() { while(~scanf("%d%d",&n,&m)&&(n+m)) { memset(g,0,sizeof(g)); memset(gg,0,sizeof(gg)); int a,b; for(int i=1;i<=m;i++) { scanf("%d%d",&a,&b); g[a][b]=1; } flood(); int ans=0; for(int i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); if(dfs_x(i)) ans++; } printf("%d\n",n-ans); } return 0; }
标签:space 一个 pre std cstring max main nbsp while
原文地址:http://www.cnblogs.com/Wangwanxiang/p/7651956.html