zoj - 1137 - Girls and Boys(二分图最大独立点集)

来源:互联网 发布:端口 编辑:程序博客网 时间:2024/06/07 23:40

题意:二分图求最大独立点集。

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1137

——>>匈牙利算法直接A……最大独立点集的元素个数 = 总元素个数 - 最大匹配数(开始做的时候总输不对样例的结果,原来题意理解反了,是求最大独立点集,而不是最大匹配数,Enhlish……)

#include <cstdio>#include <vector>#include <cstring>using namespace std;const int maxn = 10000 + 10;vector<int> G[maxn];int fa[maxn];bool vis[maxn];bool dfs(int u){    int d = G[u].size();    for(int i = 0; i < d; i++)    {        int v = G[u][i];        if(!vis[v])        {            vis[v] = 1;            int temp = fa[v];            fa[v] = u;            if(temp == -1 || dfs(temp)) return 1;            fa[v] = temp;        }    }    return 0;}int main(){    int n, i, u, v, cnt;    while(~scanf("%d", &n))    {        for(i = 0; i < maxn; i++) G[i].clear();        for(i = 0; i < n; i++)        {            scanf("%d: (%d)", &u, &cnt);            while(cnt--)            {                scanf("%d", &v);                G[u].push_back(v);                G[v].push_back(u);            }        }        memset(fa, -1, sizeof(fa));        for(i = 0; i < n; i++)        {            memset(vis, 0, sizeof(vis));            dfs(i);        }        int sum = 0;        for(i = 0; i < n; i++) if(fa[i] != -1) sum++;        printf("%d\n", n-sum/2);    }    return 0;}


原创粉丝点击