bzoj 1191
匈牙利算法。
主要要加时间戳优化。否则很容易TLE。
#include<cstdio> #include<cctype> #include<algorithm> using namespace std; const int maxn=1001,maxe=2001; int read(){ char c; while(!isdigit(c=getchar())); int x=c-'0'; while(isdigit(c=getchar())) x=x*10+c-'0'; return x; } int cnt,hed[maxn],nex[maxe],lnk[maxe],vis[maxn],cos[maxn]; void add(int u,int v){ nex[++cnt]=hed[u]; lnk[hed[u]=cnt]=v; } bool find(int o,int t){ for(int i=hed[o];i;i=nex[i]) if(vis[lnk[i]]!=t){ vis[lnk[i]]=t; if(!cos[lnk[i]] || find(cos[lnk[i]],t)) return cos[lnk[i]]=o,1; } return 0; } int main(){ int n=read(),m=read(); for(int i=1;i<=m;i+=1){ int u=read(),v=read(); add(i,u); add(i,v); } for(int i=1;i<=m;i+=1) if(!find(i,i)) return printf("%d",i-1),0; printf("%d",m); return 0; }