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< ...
随机推荐
- linux下FTP的工具和使用以及rpmReadSignature failed错误
安装rpm文件时提示rpmReadSignature failed 错误 2011-09-23 11:04 现象: [root@localhost share]# rpm -ivh syslog- ...
- arm linux 移植 jpeg
背景: host平台 :Ubuntu 16.04 arm平台 : S5P6818 jpeg :v9c arm-gcc :4.8.1 主机准备: 运行以下脚本: ## # Copyright By Sc ...
- ElasticSearch入门了解
什么是Elasticsearch: Elasticsearch,分布式,高性能,高可用,可伸缩的搜索和分析系统 1.什么是搜索? 搜索,就是在任何场景下,找寻你想要的信息,这个时候,会输入一段你要搜索 ...
- PE文件结构体-IMAGE_DATA_DIRECTORY
IMAGE_OPTIONAL_HEADER结构体最后一个成员是数组结构,大小为16,每个元素都是一个IMAGE_DATA_DIRECTORY结构体 typedef struct _IMAGE_DATA ...
- 南邮平台之Hello,RE!
小白闲逛了一下南邮平台看到了逆向这题,小白在网上看了一下别人的write up发现有点复杂.于是小白就试试看,直接Underfine然后结果就出来了.....有点意外...... 结果flag{Wel ...
- Java虚拟机05.2(内存分配)
jdk1.7中堆内存分为:年轻代+老年代+永久代.但是永久代有作为非堆内存存在,也就是说堆内存的大小应该为年轻代+老年代.在tomcat容器中,如果jsp页面过多可能出现永久代溢出.通常栈溢出都是程序 ...
- 深入理解JVM Note
第2章 Java内存区域与内存溢出异常 运行时数据区域 在虚拟机有栈.堆和方法区. 线程共享的:堆.方法区 不共享的:栈.程序计数器(代码执行的行号) 程序计数器(Program Counter Re ...
- pytesseract 识别率低提升方法
pytesseract 识别率低提升方法 一.跟换识别语言包 下载地址https://github.com/tesseract-ocr/tessdata 二.修改图片的灰度 from PIL impo ...
- OLTP和OLAP区别详解
Oracle属于OLTP类型,而gp数据库属于OLAP类型的.具体了解如下: 数据库系统一般分为两种类型,一种是面向前台应用的,应用比较简单,但是重吞吐和高并发的OLTP类型:一种是重计算的,对大数据 ...
- PG、GP与MySQL的特点和区别
参考 PostgreSQL数据库 介绍:PostgreSQL是一种运行在Unix和Linux操作系统(在NT平台借助Cygnus也可以运行)平台上的免费的开放源码的关系数据库.最早是由美国加州大学伯克 ...