二分匹配_HDU_1068

来源:互联网 发布:淘宝优惠券软件 编辑:程序博客网 时间:2024/05/25 12:21

最多能选几个点,使之两两不配对

#include<iostream>#include<cstring>#include<cstdio>const int maxn = 1005;using namespace std;int n;struct node{    int u,v,next;};node e[maxn*1000];int head[maxn], tot;int vis[maxn],link[maxn];void Init(){    tot = 0;    memset(head, -1, sizeof(head));    memset(link, -1, sizeof(link));}void Add(int u, int v){    e[tot].u = u;    e[tot].v = v;    e[tot].next = head[u];    head[u] = tot++;}int Find(int x){    vis[x] = 1;    for(int i = head[x]; i != -1; i = e[i].next)    {        int v = e[i].v;        if(!vis[v])        {            vis[v] = 1;            if(link[v] == -1 || Find(link[v]))            {                link[v] = x;                link[x] = v;                return 1;            }        }    }    return 0;}int main(){    int t,u,v;    while(scanf("%d",&n) != EOF)    {        Init();        for(int i = 0; i < n; i++)        {            scanf("%d: (%d)",&u,&t);            while(t--)            {                scanf("%d",&v);                Add(u,v);            }        }        int cnt = 0;        for(int i = 0; i < n; i++)        {            memset(vis, 0, sizeof(vis));            if(link[i]==-1&&Find(i))                    cnt++;        }        printf("%d\n",n-cnt);    }    return 0;}
0 0
原创粉丝点击