poj 1466
二分图的水题,第一次写;
基本上是参考的 = = !
代码:
1 #include<cstdio> 2 #include<vector> 3 #include<cstring> 4 #define maxn 2005 5 using namespace std; 6 7 vector<int>ve[maxn]; 8 int match[maxn]; 9 bool v[maxn]; 10 11 int dfs(int x) 12 { 13 int l=ve[x].size(); 14 for(int i=0; i<l; i++) 15 { 16 int k=ve[x][i]; 17 if(!v[k]) 18 { 19 v[k]=1; 20 if(match[k]==-1||dfs(match[k])) 21 { 22 match[k]=x; 23 return 1; 24 } 25 } 26 } 27 return 0; 28 } 29 30 int main() 31 { 32 int n,m,a,b,num,ans; 33 while(scanf("%d",&n)!=EOF) 34 { 35 ans=0; 36 memset(match,-1,sizeof match); 37 for(int i=0; i<n; i++) 38 ve[i].clear(); 39 for(int i=0; i<n; i++) 40 { 41 scanf("%d: (%d)",&a,&num); 42 while(num--) 43 { 44 scanf("%d",&b); 45 ve[a].push_back(b); 46 } 47 } 48 for(int i=0; i<n; i++) 49 { 50 memset(v,0,sizeof v); 51 ans+=dfs(i); 52 } 53 printf("%d\n",n-ans/2); 54 } 55 return 0; 56 }