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

  

posted @ 2012-03-02 00:16  快乐.  阅读(209)  评论(0编辑  收藏  举报