POJ 2771 最大点独立集
这是经典的最大点独立集
还是可以转化成最大匹配数,为什么呢,因为求出最大匹配数之和,匹配的边的两个端点互斥,只能去一个,所以最后结果就用总点数-最大匹配数即可
#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 最大点独立集的更多相关文章
- POJ 2771 Guardian of Decency(求最大点独立集)
该题反过来想:将所有可能发生恋爱关系的男女配对,那么可以带出去的人数应该等于这个二分图的最大独立集 先要做一下预处理,把不符合要求的双方先求出来, company[i][j]表示i.j四个标准都不符合 ...
- POJ 2771 Guardian of Decency (二分图最大点独立集)
Guardian of Decency Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 6133 Accepted: 25 ...
- 【POJ】1419:Graph Coloring【普通图最大点独立集】【最大团】
Graph Coloring Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5775 Accepted: 2678 ...
- POJ 3692:Kindergarten 求补图的最大点独立集 头一次接触这样的做法
Kindergarten Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5884 Accepted: 2877 Desc ...
- LightOJ1171 Knights in Chessboard (II)(二分图最大点独立集)
题目 Source http://www.lightoj.com/volume_showproblem.php?problem=1171 Description Given an m x n ches ...
- POJ1466 Girls and Boys(二分图最大点独立集)
最大点独立集就是无向图中最多的两两不相邻的点集. 二分图最大点独立集=顶点数-二分图最大边独立集(二分图最大匹配) 这一题男女分别作YX部,如果x和y有浪漫关系则连边,如此构造二分图,答案显然就是最大 ...
- HDU--3829--Cat VS Dog【最大点独立集】
链接:http://acm.hdu.edu.cn/showproblem.php?pid=3829 题意:动物园有n条狗.m头猫.p个小孩,每一个小孩有一个喜欢的动物和讨厌的动物.如今动物园要转移一些 ...
- UVA 12083 POJ 2771 Guardian of Decency
/* http://acm.hust.edu.cn/vjudge/contest/view.action?cid=71805#problem/C */ 性质: [1]二分图最大点独立数=顶点数-二分图 ...
- BZOJ 1143: [CTSC2008]祭祀river(二分图最大点独立集)
http://www.lydsy.com/JudgeOnline/problem.php?id=1143 题意: 思路: 二分图最大点独立集,首先用floyd判断一下可达情况. #include< ...
随机推荐
- javascript if else优化指南
不管是平时在学习js中还是在项目书中写js代码,都避免不了一个问题就是有时候要做大量的分支判断,很多人的第一反应就是使用if else.无可厚非,if else早平时做分支判断的时候是非常好用的,但是 ...
- 使用windows函数SetWindowsHookEx实现键盘钩子
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- 通过css 居中div的几种常用方法
1.text-align:center方式 .center{ text-align:center; } center_text{ display:inline-block; width:500px } ...
- mysql产生随机数
mysql产生随机数小结一下,可以为mysql的表生成大量的随机数: 1) 产生0到10000间的随机数 SELECT RAND() * 10000; 对应产生相应的整数 SELECT ...
- NO33 第6--7关题目讲解
客户端(电脑)通过浏览器输入域名,先找hosts文件及本地dns缓存,若都没有,就找localDNS服务器,若没有,localDNF服务器找根服务器(全球13台的那个根”.“服务器),根就把.com这 ...
- NO29 用户提权sudo配置文件详解实践--志行为审计
用户提权sudo配置文件详解实践: 放到visudo里: 验证权限:
- 第十届蓝桥杯 RSA解密(C++/ java)
一道不错的题目,借鉴了网上的代码,用了拓展欧几里得算法求逆元,再用快速乘求每次a的余数,再快速幂对余数进行幂运算. #include <bits/stdc++.h> using names ...
- bsearch的使用
懒得写二分查找,结果发现stdlib里自带了二分查找. C 库函数 void *bsearch(const void *key, const void *base, size_t nitems, si ...
- C++编程学习(十二) STL
一.简介 标准模板库STL,是一组模板类和函数.提供了: 1.容器.用于存储信息. 2.迭代器.用于访问容器中的信息. 3.算法.操作容器内容. 1.容器 STL有两种类型的容器类: (1)顺序容器 ...
- 【转】R语言主成分分析(PCA)
https://www.cnblogs.com/jin-liang/p/9064020.html 数据的导入 > data=read.csv('F:/R语言工作空间/pca/data.csv') ...