标签:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 20458 | Accepted: 11098 |
Description
Input
Output
Sample Input
3 4 1 1 1 3 2 2 3 2
Sample Output
2
Hint
我们用匈牙利算法来求最大匹配
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 7 const int maxn=505; 8 const int maxm=10005; 9 int N,K; 10 int Head[maxn],Adj[maxm],Next[maxm]; 11 int match[maxn],use[maxn]; 12 int c; 13 14 void AddEdge(int u,int v) 15 { 16 c++; 17 Adj[c]=v; 18 Next[c]=Head[u]; 19 Head[u]=c; 20 } 21 22 bool dfs(int x) 23 { 24 for(int i=Head[x];i;i=Next[i]) 25 { 26 int v=Adj[i]-N; 27 if(use[v]) continue; 28 use[v]=true; 29 if(match[v]==0||dfs(match[v])) 30 { 31 match[v]=x; 32 return true; 33 } 34 } 35 return false; 36 } 37 38 void hungarian(int &cnt) 39 { 40 for(int i=1;i<=N;i++) 41 { 42 memset(use,false,sizeof(use)); 43 if(dfs(i)) cnt++; 44 } 45 } 46 47 int main() 48 { 49 freopen("poj3041.in","r",stdin); 50 freopen("poj3041.out","w",stdout); 51 scanf("%d %d",&N,&K); 52 int a,b; 53 for(int i=1;i<=K;i++) 54 { 55 scanf("%d %d",&a,&b); 56 AddEdge(a,b+N); 57 } 58 int cnt=0; 59 hungarian(cnt); 60 printf("%d",cnt); 61 return 0; 62 }
标签:
原文地址:http://www.cnblogs.com/cnblogsLSY/p/5780603.html