POJ 2771 最大点独立集

这是经典的最大点独立集

还是可以转化成最大匹配数,为什么呢,因为求出最大匹配数之和,匹配的边的两个端点互斥,只能去一个,所以最后结果就用总点数-最大匹配数即可


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int h[600],sex[600];
char music[600][200],ball[600][200];
int d[600][600],vis[600],lefts[600];
int n;
bool match(int u)
{
for (int v=0;v<n;v++){
if (d[u][v] && !vis[v]){
vis[v]=1;
if (lefts[v]==-1 || match(lefts[v])){
lefts[v]=u;
return true;
}
}
}
return false;
}
int main()
{
int t;
char tmp[3];
scanf("%d",&t);
while (t--)
{
scanf("%d",&n);
for (int i=0;i<n;i++){
scanf("%d%s%s%s",&h[i],tmp,music[i],ball[i]);
if (tmp[0]==‘M‘) sex[i]=1;
else sex[i]=0;
}
memset(d,0,sizeof d);
for (int i=0;i<n;i++)
for (int j=i+1;j<n;j++){
if (abs(h[i]-h[j])<=40 && (sex[i]^sex[j]) && strcmp(music[i],music[j])==0 && strcmp(ball[i],ball[j])!=0){
if (sex[i]==1) d[i][j]=1;
else d[j][i]=1;
}
}
int sum=0;
memset(lefts,-1,sizeof lefts);
for (int i=0;i<n;i++){
memset(vis,0,sizeof vis);
if (match(i)) sum++;
}
int ans=n-sum;
printf("%d\n",ans);
}
return 0;
}

这个题目也可以不把男女生分开建图(上面我区分了男女,把男的放在左边)
全部统一建图,求出来的匹配数/2即可,原因很简单,其实就是统一建图就是把上面的图左右反过来又加在原图一下,所以匹配数是实际的两倍


#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int h[600],sex[600];
char music[600][20],ball[600][200];
int d[600][600],vis[600],lefts[600];
int n;
bool match(int u)
{
for (int v=0;v<n;v++){
if (d[u][v] && !vis[v]){
vis[v]=1;
if (lefts[v]==-1 || match(lefts[v])){
lefts[v]=u;
return true;
}
}
}
return false;
}
int main()
{
int t;
char tmp[3];
scanf("%d",&t);
while (t--)
{
scanf("%d",&n);
for (int i=0;i<n;i++){
scanf("%d%s%s%s",&h[i],tmp,music[i],ball[i]);
if (tmp[0]==‘M‘) sex[i]=1;
else sex[i]=0;
}
memset(d,0,sizeof d);
for (int i=0;i<n;i++)
for (int j=i+1;j<n;j++){
if (abs(h[i]-h[j])<=40 && (sex[i]^sex[j]) && strcmp(music[i],music[j])==0 && strcmp(ball[i],ball[j])!=0){
d[i][j]=d[j][i]=1;
// cout<<h[i]<<" "<<h[j]<<endl;
// cout<<i<<" is connect "<<j<<endl;
}
else d[i][j]=d[j][i]=0;
}
int sum=0;
memset(lefts,-1,sizeof lefts);
for (int i=0;i<n;i++){
memset(vis,0,sizeof vis);
if (match(i)) sum++;
}
//cout<<sum<<endl;
int ans=n-sum/2;
printf("%d\n",ans);
}
return 0;
}

POJ 2771 最大点独立集,布布扣,bubuko.com

时间: 2024-10-10 14:42:20

POJ 2771 最大点独立集的相关文章

poj 2771 Guardian of Decency【最大点独立集】

K - Guardian of Decency Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2771 Appoint description:  System Crawler  (2014-08-17) Description Frank N. Stein is a very conservative high-school teac

POJ 2771 Guardian of Decency (二分图最大点独立集)

Guardian of Decency Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 6133   Accepted: 2555 Description Frank N. Stein is a very conservative high-school teacher. He wants to take some of his students on an excursion, but he is afraid that

POJ 3692 Kindergarten【最大点独立集】

大意: 有n个boy  m个girle   boy之间相互了解  girle之间相互了解 又告诉你一些boy和girle之间相互了解的关系 问最多选出多少人使其相互之间相互了解 分析: 左集合boy  右girle 若boy与girle相互不了解则建一条边,这样,有边相连的便是不相互了解的 那么最大点独立便是选取一些点使其相互之间没有边相连也就是相互了解的 note: 由于左右集合不相等所以选取nm中的较大的作为点的个数 最后结果为2 * max(n, m) - 最大匹配 代码: 1 #incl

poj 3342 Party at Hali-Bula 判断二分图最大点独立集是否唯一

题意: 给一个二分图,判断最大点独立集是否唯一. 分析: 匈牙利算法. 代码: //poj 3342 //sep9 #include <iostream> #include <string> #include <map> using namespace std; const int maxN=212; int n; int M,v1,v2; bool g[maxN][maxN]; bool vis[maxN]; int link[maxN]; map<string

POJ 1466 Girls and Boys【最大点独立集】

大意:最大点独立集 分析:最大点独立集 代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 using namespace std; 6 7 const int maxn = 505; 8 9 int n; 10 int Link[maxn]; 11 int vis[maxn]; 12 vector<int> G[maxn

poj 2771 Guardian of Decency

Guardian of Decency http://poj.org/problem?id=2771 Time Limit: 3000MS   Memory Limit: 65536K       Description Frank N. Stein is a very conservative high-school teacher. He wants to take some of his students on an excursion, but he is afraid that som

poj——2771 Guardian of Decency

poj——2771    Guardian of Decency Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 5916   Accepted: 2458 Description Frank N. Stein is a very conservative high-school teacher. He wants to take some of his students on an excursion, but he i

HDU--3829--Cat VS Dog【最大点独立集】

链接:http://acm.hdu.edu.cn/showproblem.php?pid=3829 题意:动物园有n条狗,m头猫,p个小孩.每一个小孩有一个喜欢的动物和讨厌的动物,如今动物园要转移一些动物,假设一个小孩喜欢的动物在,不喜欢的动物不在,他就会happy,问动物最多能使几个小孩happy. 思路:一个比較明显的二分图.不能以猫狗为顶点,那样找到的是哪些动物会转移,以小孩为顶点,找出最大点独立集,有两种建图方式.一种是以小孩总数p为左右点集的顶点个数.假设小孩a喜欢的动物是小孩b不喜欢

hdu 3829 Cat VS Dog 二分图匹配 最大点独立集

Cat VS Dog Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others) Problem Description The zoo have N cats and M dogs, today there are P children visiting the zoo, each child has a like-animal and a dislike-animal, if the