POJ - 1466 Girls and Boys 二分图+最大独立集

来源:互联网 发布:简明python教程 从哪买 编辑:程序博客网 时间:2024/06/15 13:21

题目大意:有n个学生,某些学生之间存在着一种特殊的关系。。。现在要找出m个学生,要求这m个学生之间的任意两人不存在这种特殊的关系

解题思路:二分图问题,因为没办法划分成相应的两个集合且特殊关系是对称的,所以可以将两个点集都设置为n个点,求出最大匹配后再除以2即可得到(因为关系是对称的,所以所求得的最大匹配是双倍的)
得到最大匹配了,可以由定理得到 最大独立集 = n - 最大匹配数

#include<cstdio>#include<vector>#include<cstring>using namespace std;const int N = 510;vector<int> s[N];int vis[N];int link[N];int n;bool dfs(int u) {    for(int i = 0; i < s[u].size(); i++) {          if(!vis[s[u][i]]) {            vis[s[u][i]] = 1;            if(link[s[u][i]] == -1 || dfs(link[s[u][i]])) {                link[s[u][i]] = u;                return true;            }        }    }    return false;}int main() {    while(scanf("%d", &n) != EOF) {        for(int i = 0; i < n; i++)            s[i].clear();        int x, y, z;        for(int i = 0; i < n; i++) {            scanf("%d: (%d)", &x, &y);            for(int j = 0; j < y; j++) {                scanf("%d", &z);                s[x].push_back(z);            }        }        int ans = 0;        memset(link, -1, sizeof(link));        for(int i = 0; i < n; i++) {            memset(vis,0,sizeof(vis));            if(dfs(i))                ans++;        }        printf("%d\n", n - ans / 2);    }    return 0;}
0 0
原创粉丝点击