【POJ2942】Knights of the Round Table(二分图 点双联通分量)
大意
给定\(N\)个点与\(M\)个关系,每个关系表示某两个点间没有直接的边相连,求不在所有奇环上的点的个数。
(\(1\le N\le 1e3,1\le M\le 1e6\))
思路
考虑到\(N\)比较小的缘故,我们不妨暴力连边。
对于现在得到的一个图,我们需要找出所有在奇环上的点。
考虑使用点双联通分量对图进行缩点,对于每个点双分量,暴力的去判断它是否是二分图。
- ①如果是二分图,那么显然无奇环,对该点双上的点不做修改。
- ②如果不是二分图,那么对于这个点双联通分量,一定会有一个奇环, 而通过这个奇环一定可以使其他所有点在一个奇环上。
对于②情况的证明如下:
我们设有该点双分量上的某一段,使得两个端点都在该奇环上,显然每个点都会在至少一个这样的段上。
则连边关系分别是从该奇环上的某个奇段或偶段出发与图上的这一段形成环,则可以根据这一段的奇偶性与其对应的形成一个奇环。
(注:①情况不做修改是为了不覆盖②情况下处理出的答案,点双会重点)
(注:不用边双联通分量主要是为了让每个联通分量内部不存在两环只共一点的8字形)
代码
略丑,见谅
#include<map>
#include<queue>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN=1005;
const int MAXM=1000005;
int N,M,Cnt,Root=1;
int dfn[MAXN],low[MAXN];
vector<int>P[MAXN],T[MAXN];
int Anscnt,stac[MAXN],len;
vector<int>HP[MAXM];
void DFS(int u,int fad){
stac[++len]=u;
low[u]=dfn[u]=++Cnt;
int size=P[u].size();
for(int i=0;i<size;i++){
int v=P[u][i];
if(dfn[v]){
if(T[u][i]==fad)continue;
low[u]=min(low[u],dfn[v]);
continue;
}
DFS(v,T[u][i]);
low[u]=min(low[u],low[v]);
if(low[v]>=dfn[u]){
HP[++Anscnt].push_back(u);
while(1){
int x=stac[len--];
HP[Anscnt].push_back(x);
if(x==v)break;
}
}
}
}
void Add(int x,int y,int id){
P[x].push_back(y);
T[x].push_back(id);
P[y].push_back(x);
T[y].push_back(id);
}
int Vis[MAXN],Col[MAXN];
int KM[MAXN][MAXN];
int ans[MAXN],Ans;
int Check(int u){
Vis[u]=1;
int size=P[u].size();
for(int i=0;i<size;i++){
int v=P[u][i];
if(Vis[v]==-1)continue;
if(Vis[v]){
if(Col[v]==Col[u])
return 1;
continue;
}
Col[v]=(Col[u]+1)%2;
if(Check(v))return 1;
}
return 0;
}
void Init(){
memset(Vis,-1,sizeof(Vis));
memset(Col,0,sizeof(Col));
for(int i=1;i<=Anscnt;i++){
int size=HP[i].size();
for(int j=0;j<size;j++)
Vis[HP[i][j]]=0;
if(size){
if(Check(HP[i][0])){
for(int j=0;j<size;j++)
ans[HP[i][j]]=1;
}
}
for(int j=0;j<size;j++)
Vis[HP[i][j]]=-1,Col[HP[i][j]]=0;
}
}
void clear(){
Cnt=len=0;
for(int i=1;i<=N;i++){
ans[i]=0;Col[i]=0;
dfn[i]=low[i]=stac[i]=0;
P[i].clear(),T[i].clear();
for(int j=1;j<=N;j++)
KM[i][j]=0;
}
for(int i=1;i<=Anscnt;i++)HP[i].clear();
N=M=Anscnt=Ans=0;
}
int main(){
while(~scanf("%d%d",&N,&M)&&N&&M){
for(int i=1,x,y;i<=M;i++){
scanf("%d%d",&x,&y);
KM[x][y]=KM[y][x]=1;
}M=0;
for(int i=1;i<=N;i++)
for(int j=i+1;j<=N;j++)
if(!KM[i][j])Add(i,j,++M);
for(int i=1;i<=N;i++)
if(!dfn[i])DFS(i,0);
Init();
for(int i=1;i<=N;i++)
if(!ans[i])Ans++;
printf("%d\n",Ans);
clear();
}
return 0;
}
/*
5 5
1 4
1 5
2 5
3 4
4 5
5 5
1 4
1 5
2 5
3 4
4 5
5 5
1 4
1 5
2 5
3 4
4 5
0 0
*/
【POJ2942】Knights of the Round Table(二分图 点双联通分量)的更多相关文章
- POJ2942 Knights of the Round Table(点双连通分量 + 二分图染色)
题目大概说要让n个骑士坐成一圈,这一圈的人数要是奇数且大于2,此外有些骑士之间有仇恨不能坐在一起,问有多少个骑士不能入座. 双连通图上任意两点间都有两条不重复点的路径,即一个环.那么,把骑士看做点,相 ...
- POJ2942 Knights of the Round Table[点双连通分量|二分图染色|补图]
Knights of the Round Table Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 12439 Acce ...
- POJ2942 Knights of the Round Table【Tarjan点双联通分量】【二分图染色】【补图】
LINK 题目大意 有一群人,其中有一些人之间有矛盾,现在要求选出一些人形成一个环,这个环要满足如下条件: 1.人数大于1 2.总人数是奇数 3.有矛盾的人不能相邻 问有多少人不能和任何人形成任何的环 ...
- 「题解」:[POJ2942]Knights of the Round Table
问题 E: Knights of the Round Table 时间限制: 1 Sec 内存限制: 256 MB 题面 题目描述 作为一名骑士是一个非常有吸引力的职业:寻找圣杯,拯救遇难的少女,与 ...
- 【LA3523】 Knights of the Round Table (点双连通分量+染色问题?)
Being a knight is a very attractive career: searching for the Holy Grail, saving damsels in distress ...
- POJ 2942Knights of the Round Table(二分图判定+双连通分量)
题目链接 题意:一些骑士,他们有些人之间有矛盾,现在要求选出一些骑士围成一圈,圈要满足如下条件:1.人数大于1.2.总人数为奇数.3.有仇恨的骑士不能挨着坐.问有几个骑士不能和任何人形成任何的圆圈. ...
- UVA 1364 - Knights of the Round Table (获得双连接组件 + 二部图推理染色)
尤其是不要谈了些什么,我想A这个问题! FML啊.....! 题意来自 kuangbin: 亚瑟王要在圆桌上召开骑士会议.为了不引发骑士之间的冲突. 而且可以让会议的议题有令人惬意的结果,每次开会前都 ...
- poj2942 Knights of the Round Table,无向图点双联通,二分图判定
点击打开链接 无向图点双联通.二分图判定 <span style="font-size:18px;">#include <cstdio> #include ...
- POJ2942 Knights of the Round Table 点双连通分量 二分图判定
题目大意 有N个骑士,给出某些骑士之间的仇恨关系,每次开会时会选一些骑士开,骑士们会围坐在一个圆桌旁.一次会议能够顺利举行,要满足两个条件:1.任意相互憎恨的两个骑士不能相邻.2.开会人数为大于2的奇 ...
随机推荐
- Kafka基础教程(四):.net core集成使用Kafka消息队列
.net core使用Kafka可以像上一篇介绍的封装那样使用(Kafka基础教程(三):C#使用Kafka消息队列),但是我还是觉得再做一层封装比较好,同时还能使用它做一个日志收集的功能. 因为代码 ...
- Swoole 中使用 Context 类管理上下文,防止发生数据错乱
前面的文章中,我们说过:不能使用类静态变量 Class::$array / 全局变量 global $_array / 全局对象属性 $object->array / 其他超全局变量 $GLOB ...
- SpringBoot 之 整合JDBC使用
导入相关依赖: # pom.xml <dependency> <groupId>org.springframework.boot</groupId> <art ...
- svn创建多个版本库
mkdir /pangbing cd /pangbing/ svnadmin create 1 svnadmin create 2 svnadmin create3 启动时候这样启动 svnserve ...
- Linux_无法解析域名
现象如下:ping baidu.com不通,但是ping 114.114.114.114能通 产生的问题:无法使用 wget下载包 解决方法:增加DNS配置. 注:配置的域名解析地址必须能Ping通.
- Linux_yum安装时报404错误
使用yum安装报错如下: [root@localhost ~]# yum install gcc 已加载插件:fastestmirror Loading mirror speeds from cach ...
- thrift基础知识
1. 架构图 Thrift 包含一个完整的堆栈结构用于构建客户端和服务器端.下图描绘了 Thrift 的整体架构. 图 1. 架构图 如图所示,图中黄色部分是用户实现的业务逻辑,褐色部分是根据 Thr ...
- pytest文档8-参数化(parametrize)结合allure.title()生成不同标题报告
参数化parametrize 先看一个简单的pytest参数化案例演示test_a.py # test_a.py import pytest import allure def login(usern ...
- 配置Nginx使用Active Directory 做认证
配置Nginx使用AD做认证 nginx.conf 配置 http { ldap_server ldap { url ldap://xxx:389/DC=test,DC=com?sAMAccountN ...
- 源码安装 python3.7
yum install libffi-devel openssl -y wget https://www.python.org/ftp/python/3.7.4/Python-3.7.4.tgz ta ...