匈牙利算法
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 using namespace std; 8 int n,m,t; 9 int vis[1002],link[1002],line[1002][1002]; 10 bool find(int x) 11 { 12 for(int i=0;i<n;i++) 13 { 14 if(line[x][i]&&!vis[i]) 15 { 16 vis[i]=1; 17 if(link[i]==-1||find(link[i])) 18 { 19 link[i]=x; 20 return true; 21 } 22 } 23 } 24 return false; 25 } 26 27 int main() 28 { 29 int i,j,k; 30 //freopen("1.in","r",stdin); 31 while(scanf("%d",&n)!=EOF) 32 { 33 int p,q; 34 int tot=0; 35 memset(link,-1,sizeof(link)); 36 memset(line,0,sizeof(line)); 37 for(i=1;i<=n;i++) 38 { 39 scanf("%d: (%d)",&p,&q); 40 for(j=0;j<q;j++) 41 { 42 scanf("%d",&k); 43 line[p][k]=1; 44 } 45 } 46 for(i=0;i<n;i++) 47 { 48 memset(vis,0,sizeof(vis)); 49 if(find(i)) tot++; 50 } 51 //printf("%d %d\n",n,tot); 52 printf("%d\n",n-tot/2); 53 } 54 return 0; 55 }
时间: 2024-10-25 05:20:09