您的位置:首页 > 其它

hdu1054 二分图水题

2013-12-12 20:04 225 查看
二分图模板题

#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
vector<int>e[4000];
bool vis[4000];
int link[4000];
int n;
bool find(int a)
{
    for(int i = 0;i<e[a].size();i++)
    {
        int v = e[a][i];
        if(!vis[v])
        {
            vis[v] = true;
            if(link[v] == 0||find(link[v]))
            {
                link[v] = a;
                return true;
            }
        }
    }
    return false;
}
int hungray()
{
    int ans = 0;
    memset(link,0,sizeof(link));
    for(int i = 0;i<n;i++)
    {
        memset(vis,0,sizeof(vis));
        if(find(i))++ans;
    }
    return ans;
}
int main()
{
    int i,j,a,b,c;
    while(scanf("%d",&n)!=EOF)
    {
        for(i = 0;i<n;i++)e[i].clear();
        for(i = 1;i<=n;i++)
        {
            scanf("%d:(%d)",&a,&b);
            for(j = 1;j<=b;j++)
            {
                scanf("%d",&c);
                e[a].push_back(c);
                e[c].push_back(a);
            }
        }
        printf("%d\n",hungray()/2);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: