这是经典的最大点独立集

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

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

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

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

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

  1. POJ 2771 Guardian of Decency(求最大点独立集)

    该题反过来想:将所有可能发生恋爱关系的男女配对,那么可以带出去的人数应该等于这个二分图的最大独立集 先要做一下预处理,把不符合要求的双方先求出来, company[i][j]表示i.j四个标准都不符合 ...

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

    Guardian of Decency Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 6133   Accepted: 25 ...

  3. 【POJ】1419:Graph Coloring【普通图最大点独立集】【最大团】

    Graph Coloring Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5775   Accepted: 2678   ...

  4. POJ 3692:Kindergarten 求补图的最大点独立集 头一次接触这样的做法

    Kindergarten Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5884   Accepted: 2877 Desc ...

  5. LightOJ1171 Knights in Chessboard (II)(二分图最大点独立集)

    题目 Source http://www.lightoj.com/volume_showproblem.php?problem=1171 Description Given an m x n ches ...

  6. POJ1466 Girls and Boys(二分图最大点独立集)

    最大点独立集就是无向图中最多的两两不相邻的点集. 二分图最大点独立集=顶点数-二分图最大边独立集(二分图最大匹配) 这一题男女分别作YX部,如果x和y有浪漫关系则连边,如此构造二分图,答案显然就是最大 ...

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

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=3829 题意:动物园有n条狗.m头猫.p个小孩,每一个小孩有一个喜欢的动物和讨厌的动物.如今动物园要转移一些 ...

  8. UVA 12083 POJ 2771 Guardian of Decency

    /* http://acm.hust.edu.cn/vjudge/contest/view.action?cid=71805#problem/C */ 性质: [1]二分图最大点独立数=顶点数-二分图 ...

  9. BZOJ 1143: [CTSC2008]祭祀river(二分图最大点独立集)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1143 题意: 思路: 二分图最大点独立集,首先用floyd判断一下可达情况. #include< ...

随机推荐

  1. $.ajax方法提交数组参数

    springmvc框架 var param = new Object(); var arr = new Array(); arr.push(1,2,3); param.ids=JSON.stringi ...

  2. POJ 1027:The Same Game 较(chao)为(ji)复(ma)杂(fan)的模拟

    The Same Game Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5168   Accepted: 1944 Des ...

  3. swagger获取

    参考 https://www.jianshu.com/p/840320d431a1 https://www.cnblogs.com/luoluocaihong/p/7106276.html

  4. 一个小证明(题解 P5425 Part1)

    所以这道题为什么可以这样做 嗯,我也不知道,不过我是来填坑的. \(Q\):为什么要把牛分成\(1\),\(1\)......\(N-K+1\)这样的\(K\)组呢? \(A\):我们设第\(i\)组 ...

  5. string.xml中的空格

    <string name="userName">    用    户    名</string>

  6. stl_map复习

    set和map的底层模板是红黑树,可以有不同的键值和实值,关于增删改查,迭代器的使用都在代码里面,亲手尝试更方便记忆 #include <iostream>#include <map ...

  7. JSONObject 和JSONArray基本使用

    1. 打包 JSONObject jsonObject = new JSONObject(); jsonObject.put("code", "200"); j ...

  8. FC 与 FB 与 OB 的区别,时间标记冲突与一致性检查 有详细的步骤

    关键字1 组织块的程序是由用户自己编写. 关键字2 时间标记冲突与一致性检查 有详细的步骤. 关键字3 FC 与 FB 与 OB 的区别?   (一)功能 功能块 区别 ? FB 和FC均为 用户编写 ...

  9. UVA - 712 S-Trees(S树)

    题意:0往左走,1往右走,已知所有叶子的值,每个查询都是根结点到叶子结点的路径,路径的每一个点分别对应着x1,x2,x3……但是实际上的S树的路径可能并非是x1,x2,x3…… 分析:先存路径变量的顺 ...

  10. uniapp 小程序实现自定义底部导航栏(tarbar)

    在小程序开发中,默认底部导航栏很难满足实际需求,好在官方给出了自定义形式,效果如下: 话不多说,直接上代码 1.组件 custom-tarbar.vue文件 <template> < ...