【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的奇 ...
随机推荐
- 『无为则无心』Python函数 — 29、Python变量和参数传递
目录 1.Python的变量 (1)Python变量不能独立存在 (2)变量是内存中数据的引用 (3)注意点 2.了解变量的引用 3.Python的参数传递(重点) (1)示例 (2)结论 (3)总结 ...
- 为什么要避免在 Go 中使用 ioutil.ReadAll?
原文链接: 为什么要避免在 Go 中使用 ioutil.ReadAll? ioutil.ReadAll 主要的作用是从一个 io.Reader 中读取所有数据,直到结尾. 在 GitHub 上搜索 i ...
- Redis_客户端命令和数据操作(3)
更多命令请查找:http://c.biancheng.net/redis_command/ 切换数据库 redis数据库没有名称,默认有16个,通过0-15来标识,连接redis默认选择第一个数据库, ...
- yum是什么?repo文件详解,epel简介,yum源的更换,repo和epel区别
yum是什么?repo文件详解,epel简介,yum源的更换,repo和epel区别 简单概括: repo和epel的关系 repo是配置源的,即配置从哪里下载包(以及依赖关系)的. epel是作为桥 ...
- java单元测试调用mybatis接口并执行
今天想使用单元测试类,存储一些数据到mysql,可是,一直在报错,org.springframework.beans.factory.NoSuchBeanDefinitionException: No ...
- Echart可视化学习(十)
文档的源代码地址,需要的下载就可以了(访问密码:7567) https://url56.ctfile.com/f/34653256-527823386-04154f 官网找到类似实例, 适当分析,并且 ...
- vue js格式化数字为金额格式
/** * @description 格式化金额 * @param number:要格式化的数字 * @param decimals:保留几位小数 默认0位 * @param decPoint:小数点 ...
- 5大最新云原生镜像构建工具全解析,3个来自Google,你了解几个?
1云原生大背景下的镜像构建在分享开始,我想先跟大家简单聊一下云原生,可能不会详细展开,而是带领大家了解一下云原生对镜像构建方面的影响.第一,在接触云原生相关的技术时,无论是要解决开发.测试环境的问题, ...
- Java 内幕新闻第二期深度解读
这是由 Java 官方发布,Oracle JDK 研发 Nipafx 制作的节目,包含 JDK 近期的研发进展和新特性展望和使用,这里加上个人译制的字幕搬运而来.我把 Nipafx 的扩展资料详细研读 ...
- ecos matlab版本安装
官网链接 github地址 1.注意不仅要下载matlab版本,同时还要下载c版本,因为matlab版本缺少第三方软件,将两个版本解压缩后将c版本下的文件夹external,ecos_bb,inclu ...