二分图匹配水题。
一开始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 ",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 */