POJ 3894 System Engineer 二分匹配
http://poj.org/problem?id=3894
学长推荐的这个题,他预言这题可以改变俺的人生观,世界观。。。
就是有几个需要注意色温地方 1 n<=10000所以用链表 2 员工标记是从 n~n-1所以 link[MAX] vs[MAX]都是错的 应是link[MAX*2] vs[MAX*2]
3 edge[MAX]数组明显开小了 edge[MAX*MAX]系统是可以接受的 (MAX=10005)
代码:
#include<iostream> #include<cstdio> #include<string> #include<cstring> #define MAX 10005 using namespace std; int head[MAX],link[MAX*2]; bool vs[MAX*2]; int n,s_edge; struct Edge { int to,nxt; }edge[MAX*MAX]; void addedge(int u,int v) { s_edge++; edge[s_edge].to=v; edge[s_edge].nxt=head[u];//又是这里 =s_edge head[u]=s_edge; } bool dfs(int x) { for(int e=head[x];e!=0;e=edge[e].nxt) { int v=edge[e].to; if(!vs[v]) { vs[v]=1; if(link[v]==-1||dfs(link[v])) { link[v]=x; return 1; } } } return 0; } int main() { int i,u,v,num; char ch1,sh2,ch3; while(~scanf("%d",&n)) { s_edge=0; memset(head,0,sizeof(head)); for(i=0;i<n;i++) { scanf("%d: (%d)",&u,&num); while(num--) { scanf("%d",&v); addedge(u,v); } } int ans=0; memset(link,-1,sizeof(link));//-1!!! for(i=0;i<n;i++) { memset(vs,0,sizeof(vs)); if(dfs(i))ans++; } printf("%d\n",ans); } return 0; }