3041

1 /*
2 找出最少的顶点把所有的边都覆盖了
3 最小顶点覆盖问题= 最大匹配问题
4 可hungarian算法来解决
5 采用邻接标 O(N*M)
6 */
7
8 // include file
9 #include <cstdio>
10 #include <cstdlib>
11 #include <cstring>
12 #include <cmath>
13 #include <cctype>
14 #include <ctime>
15
16 #include <iostream>
17 #include <sstream>
18 #include <fstream>
19 #include <iomanip>
20 #include <bitset>
21 #include <strstream>
22
23 #include <algorithm>
24 #include <string>
25 #include <vector>
26 #include <queue>
27 #include <set>
28 #include <list>
29 #include <functional>
30
31 using namespace std;
32
33 // typedef
34 typedef long long LL;
35 typedef unsigned long long ULL;
36
37 //
38 #define read freopen("in.txt","r",stdin)
39 #define write freopen("out.txt","w",stdout)
40 #define FORi(a,b,c) for(int i=(a);i<(b);i+=c)
41 #define FORj(a,b,c) for(int j=(a);j<(b);j+=c)
42 #define FORk(a,b,c) for(int k=(a);k<(b);k+=c)
43 #define FORp(a,b,c) for(int p=(a);p<(b);p+=c)
44
45 #define FF(i,a) for(int i=0;i<(a);i+++)
46 #define FFD(i,a) for(int i=(a)-1;i>=0;i--)
47 #define Z(a) (a<<1)
48 #define Y(a) (a>>1)
49
50 const double eps = 1e-6;
51 const double INFf = 1e10;
52 const int INFi = 1000000000;
53 const double Pi = acos(-1.0);
54
55 template<class T> inline T sqr(T a){return a*a;}
56 template<class T> inline T TMAX(T x,T y)
57 {
58 if(x>y) return x;
59 return y;
60 }
61 template<class T> inline T TMIN(T x,T y)
62 {
63 if(x<y) return x;
64 return y;
65 }
66 template<class T> inline void SWAP(T &x,T &y)
67 {
68 T t = x;
69 x = y;
70 y = t;
71 }
72 template<class T> inline T MMAX(T x,T y,T z)
73 {
74 return TMAX(TMAX(x,y),z);
75 }
76
77
78 // code begin
79
80 #define MAXN 510
81 vector<int> G[MAXN];
82 int mt[MAXN];
83 bool used[MAXN];
84 int N,K,ans1;
85
86 bool hungarian_MM(int i)
87 {
88 FORj(0,G[i].size(),1)
89 {
90 if(!used[ G[i][j] ])
91 {
92 used[ G[i][j] ] = 1;
93 if( mt[ G[i][j] ]==-1 || hungarian_MM( mt[G[i][j]] ))
94 {
95 mt[ G[i][j] ] = i;
96 return true;
97 }
98 }
99 }
100 return false;
101 }
102
103 int main()
104 {
105 read;
106 write;
107 int a,b;
108 while(scanf("%d %d",&N,&K)!=-1)
109 {
110 FORi(1,N+1,1)
111 {
112 G[i].clear();
113 }
114 while(K--)
115 {
116 scanf("%d %d",&a,&b);
117 G[a].push_back(b);
118 }
119
120 ans1 = 0;
121 memset(mt,-1,sizeof(int)*MAXN);
122 FORi(1,N+1,1)
123 {
124 memset(used,0,sizeof(used));
125 if( hungarian_MM(i) )
126 {
127 ans1++;
128 }
129 }
130
131
132 printf("%d\n",ans1);
133 }
134 return 0;
135 }
posted @ 2011-03-04 14:29  AC2012  阅读(287)  评论(0编辑  收藏  举报