标签:
Time Limit: 1000MS | Memory Limit: 10000KB | 64bit IO Format: %I64d & %I64u |
Description
Input
Output
Sample Input
5 5
2 2 5
3 2 3 4
2 1 5
3 1 2 5
1 2
Sample Output
4
Source
很裸很普通的二分图匹配。
跑一遍匈牙利算法就好。
说起来今天上午模拟赛的时候,我明明已经两个月没碰过二分图匹配了,居然还是凭着本能流畅地打出了匈牙利的模板,当时超感动。
……虽然说后来知道那道题不能用匈牙利算……
1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstring> 5 #include<iostream> 6 #include<vector> 7 #include<queue> 8 using namespace std; 9 const int mxn=1002; 10 int n,m; 11 vector<int>e[mxn]; 12 bool vis[mxn]; 13 int link[mxn]; 14 int cnt=0; 15 16 int dfs(int s){ 17 int i,j; 18 for(i=0;i<e[s].size();i++){ 19 int v=e[s][i]; 20 if(!vis[v]){ 21 vis[v]=1; 22 if(!link[v] || dfs(link[v])){ 23 link[v]=s; 24 return 1; 25 } 26 } 27 } 28 return 0; 29 } 30 int main(){ 31 while(scanf("%d%d",&n,&m)!=EOF){ 32 memset(link,0,sizeof link); 33 for(int i=1;i<=n;i++)e[i].clear(); 34 cnt=0; 35 int i,j; 36 int num,to; 37 for(i=1;i<=n;i++){ 38 scanf("%d",&num); 39 for(j=1;j<=num;j++){ 40 scanf("%d",&to); 41 e[i].push_back(to); 42 } 43 } 44 for(i=1;i<=n;i++){ 45 memset(vis,0,sizeof vis); 46 if(dfs(i))cnt++; 47 } 48 printf("%d\n",cnt); 49 } 50 51 return 0; 52 }
标签:
原文地址:http://www.cnblogs.com/SilverNebula/p/5668408.html