BZOJ 1191 [HNOI2006]超级英雄Hero

二分图匹配水题。

一开始WA了一发,没注意一题没答上就要滚粗。真残酷啊。

就像Noip后将要滚粗的自己。

 

 1 //Achen
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<cstdlib>
 6 #include<cstdio>
 7 #include<cmath>
 8 #include<queue>
 9 #include<set>
10 #include<map>
11 #define For(i,a,b) for(int i=(a);i<=(b);i++)
12 #define Rep(i,a,b) for(int i=(a);i>=(b);i--)
13 const int N=5007;
14 typedef long long LL;
15 typedef double db;
16 using namespace std;
17 int n,m,ans;
18 
19 template<typename T>void read(T &x) {
20     char ch=getchar(); x=0; T f=1;
21     while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
22     if(ch=='-') f=-1,ch=getchar();
23     for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; x*=f;
24 }
25 
26 int ecnt,fir[N],nxt[N],to[N],vis[N],pr[N];
27 void add(int u,int v) {
28     nxt[++ecnt]=fir[u]; fir[u]=ecnt; to[ecnt]=v;
29 }
30 
31 int find(int x) {
32     for(int i=fir[x];i;i=nxt[i]) if(!vis[to[i]]) {
33         vis[to[i]]=1;
34         if(!pr[to[i]]||find(pr[to[i]])) {
35             pr[to[i]]=x;
36             return 1;
37         }
38     }
39     return 0;
40 }
41 
42 int main() {
43     read(n); read(m);
44     For(i,1,m) {
45         int x,y;
46         read(x); read(y);
47         add(i,x); if(x!=y) add(i,y);
48     }
49     For(i,1,m) {
50         memset(vis,0,sizeof(vis));
51         if(find(i)) ans++; 
52         else break;
53     }
54     printf("%d\n",ans);
55     return 0;
56 }
57 /*
58 5 6 
59 3 2
60 2 0 
61 0 3 
62 0 4
63 3 2
64 3 2
65 */
View Code

 

posted @ 2017-09-29 08:05  啊宸  阅读(172)  评论(0编辑  收藏  举报