标签:
Time Limit: 5000MS | Memory Limit: 10000K | |
Total Submissions: 11134 | Accepted: 4981 |
Description
Input
Output
Sample Input
7 0: (3) 4 5 6 1: (2) 4 6 2: (0) 3: (0) 4: (2) 0 1 5: (1) 0 6: (2) 0 1 3 0: (2) 1 2 1: (1) 0 2: (1) 0
Sample Output
5 2题意:
在大学的第二年有人开始研究男女学生之间的“浪漫”关系,所谓“浪漫”关系是在男女学生之间的,给你每个学生的编号以及他们之间的浪漫关系,请你找出一个最大的学生集合,使得这个集合里任意两个学生之间没有浪漫关系,求这个集合的学生人数。
解析:
赤裸裸的最大独立集的问题,先建二分图,还是最原始的拆点建图,每个点拆成左右两个点, 有关系的点之间建边,然后求最大匹配数,但这里要注意,由于关系是相互的,所以这里求出的最大匹配数是原来的二倍,要 / 2才对。
二分图的最大独立集 =二分图的点数 - 二分图的最大匹配数。
#include <cstdio> #include <cstring> #include <algorithm> #define maxn 550 using namespace std; int map[maxn][maxn]; int used[maxn]; int link[maxn]; int n; void init(){ memset(map, 0, sizeof(map)); } void getmap(){ for(int j = 0; j < n; ++j){ int id, m, a; scanf("%d: (%d)", &id, &m); for(int i = 0; i < m; ++i){ scanf("%d", &a); map[id][a] = 1; } } } bool dfs(int x){ for(int i = 0; i < n; ++i){ if(map[x][i] && !used[i]){ used[i] = 1; if(link[i] == -1 || dfs(link[i])){ link[i] = x; return true; } } } return false; } int hungary(){ int ans = 0; memset(link, -1, sizeof(link)); for(int i = 0; i < n; ++i){ memset(used, 0, sizeof(used)); if(dfs(i)) ans++; } return ans; } int main (){ while(scanf("%d", &n) != EOF){ init(); getmap(); int sum = hungary(); //printf("%d\n", sum); printf("%d\n", n - sum / 2); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
POJ 1466 && ZOJ 1137--Girls and Boys【二分图 && 最大点独立集】
标签:
原文地址:http://blog.csdn.net/hpuhjh/article/details/47982753