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-ans/2);
54     }
55     return 0;
56 }
View Code
原文地址:https://www.cnblogs.com/yours1103/p/3312644.html