标签:des style blog http color os io strong
Description
Input
Output
Sample Input
2 4 35 M classicism programming 0 M baroque skiing 43 M baroque chess 30 F baroque soccer 8 27 M romance programming 194 F baroque programming 67 M baroque ping-pong 51 M classicism programming 80 M classicism Paintball 35 M baroque ping-pong 39 F romance ping-pong 110 M romance Paintball
Sample Output
3 7
今天通过这个题来总结一类题:二分图的最大点独立集
首先是最大点独立集的概念:在二分图中选取一些点使其能够覆盖所有的边
另外还有一个概念叫最大点权独立集
顾名思义就是每个点上赋予了一个权值
公式: 最大点独立集 = 总点数 - 最大匹配 = 总点数 - 最大流
最大点权独立集 = 总权值 - 最大流
有一些题需要拆点来做
那么用 2n 当做总点数 求出来的最大匹配自然也是2倍 此时的最大点独立集 = (2 * n - 最大匹配) / 2
题意:
有一些同学外出游玩
只要满足一下任何一个条件两个同学就能结伴出去玩
1身高相差大于40cm
2性别相同
3喜欢不同的音乐
4喜欢不同的体育
问最多能选出多少个学生外出游玩使其中任意两个学生都满足以上任意一条条件
分析:
逆向建边,那么任意两个相连的点都不能够结伴出去
那么点独立集中的点就代表选出的点之间没有边相连,也就是符合条件的点集
那么最大点独立集就是所求的结果
代码:
1 #include <iostream> 2 #include <cmath> 3 #include <cstring> 4 #include <cstdio> 5 #include <queue> 6 using namespace std; 7 8 const int maxn = 505; 9 10 vector<int> G[maxn]; 11 int vis[maxn]; 12 int Link[maxn]; 13 bool Find(int u) { 14 for(int i = 0; i < G[u].size(); i++) { 15 int v = G[u][i]; 16 if(!vis[v]) { 17 vis[v] = 1; 18 if(Link[v] == -1 || Find(Link[v]) ) { 19 Link[v] = u; 20 return true; 21 } 22 } 23 } 24 return false; 25 } 26 27 int n; 28 int solve() { 29 int cnt = 0; memset(Link, -1, sizeof(Link)); 30 for(int i = 1; i <= n; i++) { 31 if(G[i].size()) { 32 memset(vis, 0, sizeof(vis)); 33 if(Find(i)) cnt++; 34 } 35 } 36 return cnt; 37 } 38 39 struct Student { 40 int high; 41 char sex; 42 char music[105]; 43 char sport[105]; 44 }stu[maxn]; 45 46 bool check(int i, int j) { 47 if(fabs(stu[i].high - stu[j].high) > 40) return false; 48 if(stu[i].sex == stu[j].sex) return false; 49 if(strcmp(stu[i].music, stu[j].music) != 0) return false; 50 if(strcmp(stu[i].sport, stu[j].sport) == 0) return false; 51 return true; 52 } 53 54 int main() { 55 int t; 56 scanf("%d",&t); 57 while(t--) { 58 scanf("%d",&n); 59 for(int i = 1; i <= n; i++) { 60 G[i].clear(); 61 scanf("%d %c %s %s",&stu[i].high, &stu[i].sex, stu[i].music, stu[i].sport); 62 } 63 for(int i = 1; i <= n; i++) { 64 for(int j = 1; j <= n; j++) { 65 if(i == j) continue; 66 if(check(i, j)) G[i].push_back(j); 67 } 68 } 69 int ans = solve(); 70 // printf("solve == %d\n",ans); 71 printf("%d\n", (2 * n - ans) / 2); 72 } 73 return 0; 74 }
poj 2771 Guardian of Decency【最大点独立集】,布布扣,bubuko.com
poj 2771 Guardian of Decency【最大点独立集】
标签:des style blog http color os io strong
原文地址:http://www.cnblogs.com/zhanzhao/p/3924040.html