标签:
Time Limit: 6000MS | Memory Limit: 65536K | |
Total Submissions: 7035 | Accepted: 2860 |
Description
Input
Output
Sample Input
1 0 2 1 1 2 2 0 0 0
Sample Output
1 1 2
Source
/** 题意:最小路径覆盖 做法:二分图最大匹配 有向无环图的最小路径覆盖 = 该图的顶点数-该图的最大匹配。 **/ #include<iostream> #include<string.h> #include<stdio.h> #include<cmath> #include<algorithm> #include<queue> using namespace std; #define maxn 510 int g[maxn][maxn]; int linker[maxn]; int used[maxn]; int n,m; bool dfs(int u) { for(int v = 0; v<n; v++) { if(g[u][v] && used[v] == 0) { used[v] = 1; if(linker[v] == -1 || dfs(linker[v])) { linker[v] = u; return true; } } } return false; } int hungary() { int res = 0; memset(linker,-1,sizeof(linker)); for(int i=0; i<n; i++) { memset(used,0,sizeof(used)); if(dfs(i)) res++; } return res; } void Floyd() { int i,j,k; for(i=0; i<n; i++) { for(j=0; j<n; j++) { if(g[i][j]==0) { for(k=0; k<n; k++) { if(g[i][k]==1&&g[k][j]==1) { g[i][j]=1; break; } } } } } } int main() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif // ONLINE_JUDGE while(~scanf("%d %d",&n,&m)) { if(n == 0 && m == 0) break; memset(g,0,sizeof(g)); int u,v; for(int i=0; i<m; i++) { scanf("%d %d",&u,&v); u--; v--; g[u][v] = 1; } Floyd(); int res = hungary(); printf("%d\n",n-res); } return 0; }
标签:
原文地址:http://www.cnblogs.com/chenyang920/p/4392788.html