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;
}

浙公网安备 33010602011771号