hdu1068(二分)Girls and Boys

来源:互联网 发布:淘宝价格用什么字体 编辑:程序博客网 时间:2024/05/17 22:34

最大独立集 = 节点 - 最大匹配

#include <stdio.h>#include <string.h>const int MAXN = 5010;//点const int MAXM = 50010;//边struct Edge{    int to, next;} edge[MAXM];int head[MAXN], tot;void init(){    tot = 0;    memset(head, -1, sizeof(head));}void addedge(int u, int v){    edge[tot].to = v;    edge[tot].next = head[u];    head[u] = tot++;}int linker[MAXN];int un;//左边匹配点数bool used[MAXN];bool dfs(int u){    for(int i = head[u]; i != -1; i = edge[i].next)    {        //printf("-1\n");        int v = edge[i].to;        if(!used[v])        {            used[v] = true;            if(linker[v] == -1 || dfs(linker[v]))            {                linker[v] = u;                return true;            }        }    }    return false;}int hungary(){    int res = 0;    memset(linker, -1, sizeof(linker));    for(int u = 0; u < un; u++)    {        memset(used, false, sizeof(used));        if(dfs(u))            res++;    }    return res;}int main(){    int i;    while(scanf("%d", &un) != EOF)    {        init();        for(int i = 0; i < un; i++)        {            int k;            // printf("", i);            scanf("%d: (%d)",&i, &k);            for(int j = 0; j < k; j++)            {                int x;                scanf("%d", &x);                addedge(i, x);            }        }        int ans = un - hungary() / 2;        printf("%d\n", ans);    }}/*73 4 5 62 4 6002 0 11 02 0 1*/
0 0
原创粉丝点击