HDU1054

二分图最小点覆盖

搞清楚 最大匹配,二分图,增广路

模板不长,搞清楚为什么。。。算法懂了,以后还要继续学习,很多细节不懂,还要学会证明!!

http://www.cnblogs.com/budapeng/p/3273293.html

跟着算法走一遍,很好懂。。

#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX 1505
using namespace std;

int vis[MAX],fa[MAX],head[MAX],tot;
struct node
{
    int u,v,next;
}edge[MAX<<1];

void init()
{
    memset(head,-1,sizeof(head));
    memset(fa,-1,sizeof(fa));
    tot=0;

}

void addedge(int u,int v)
{
    edge[tot].u=u;
    edge[tot].v=v;
    edge[tot].next=head[u];
    head[u]=tot++;
}

int dfs(int u)
{
    for(int i=head[u];i!=-1;i=edge[i].next)
    {
        int v=edge[i].v;
        if(!vis[v])
        {
            vis[v]=1;
            if(fa[v]==-1||dfs(fa[v]))
            {
                fa[v]=u;
                return 1;
            }
        }
    }
    return 0;
}

int main()
{
    //freopen("t.txt","r",stdin);
    int n,c,res,a,b;
    while(scanf("%d",&n)!=EOF)
    {
        init();
        res=0;
        for(int i=0;i<n;i++)
        {
            scanf("%d:(%d)",&a,&c);
            for(int j=0;j<c;j++)
            {
                scanf("%d",&b);
                addedge(a,b);
                addedge(b,a);
            }
        }
        for(int i=0;i<n;i++)
        {
            if(head[i]!=-1)
            {
                memset(vis,0,sizeof(vis));
                res=res+dfs(i);
            }
        }
        printf("%d\n",res/2);
    }

    return 0;
}


你可能感兴趣的:(HDU1054)