bzoj1191: [HNOI2006]超级英雄Hero
二分图最大顺序匹配。 拿题目编号和锦囊编号建二分图,跑匈牙利算法。
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn = 2000 + 10; const int maxm = 4000 + 10; int n,m,e; int v[maxn],next[maxm],h[maxn]; int p[maxn]; bool vis[maxn]; void add(int a,int b) { v[e] = b; next[e] = h[a]; h[a] = e++; } bool find(int u) { if(vis[u]) return false; vis[u] = true; for(int i = h[u]; ~i; i = next[i]) if(!p[v[i]] || find(p[v[i]])) { p[v[i]] = u; return true; } return false; } int main() { scanf("%d%d",&n,&m); memset(h,-1,sizeof(h)); for(int i = 1,a,b; i <= m; i++) { scanf("%d%d",&a,&b); add(i,a); add(i,b); } int res; for(res = 1; res <= m; res++) { memset(vis,0,sizeof(vis)); if(!find(res)) break; } printf("%d\n",res-1); return 0; }