「题解」:[POJ2942]Knights of the Round Table
问题 E: Knights of the Round Table
时间限制: 1 Sec 内存限制: 256 MB
题面
题目描述
作为一名骑士是一个非常有吸引力的职业:寻找圣杯,拯救遇难的少女,与其他骑士一起喝酒是有趣的事情。因此,近年来亚瑟王国经历了骑士人数空前增加,这并不奇怪。现在有这么多骑士,每个圆桌骑士都可以同时来到卡米洛特并坐在圆桌旁;通常只有一小群骑士在那里,而其他人则忙于在全国各地做英雄事迹。
在讨论中,骑士很容易过度兴奋 - 特别是在喝了几杯酒之后。在发生一些不幸的事故之后,亚瑟王要求着名的精灵梅林确保将来不会在骑士之间爆发战斗。在仔细研究了这个问题之后,Merlin意识到只有骑士按照以下两条规则坐下才能防止战斗:
骑士应该坐着,这样两个相互仇恨的骑士不应该是桌子上的邻居。 (梅林有一个清单,上面写着谁讨厌谁。)骑士围坐在圆桌会议上,因此每个骑士都有两个邻居。
奇数骑士应坐在桌子周围。这确保了如果骑士无法就某事达成一致,那么他们可以通过投票解决问题。 (如果骑士的数量是偶数,则可以发生“是”和“否”具有相同的投票数,并且论证继续进行。)
只有满足这两条规则,梅林才会让骑士坐下来,否则他会取消会议。 (如果只有一个骑士出现,那么会议也会被取消,因为一个人不能坐在桌子旁。)Merlin意识到这意味着骑士不能参加任何符合这些规则的座位安排,并且这些骑士永远无法坐在圆桌会议上(如果一个骑士讨厌其他所有骑士,就会出现这种情况,但还有很多其他可能的原因)。如果骑士不能坐在圆桌会议上,那么他就不能成为圆桌骑士团的成员,必须从骑士团中被驱逐出去。这些骑士必须转移到一个不那么有声望的秩序,如方桌骑士团,八角桌骑士团或香蕉形桌骑士团。为了帮助Merlin,你必须编写一个程序来确定必须被驱逐的骑士数量。
输入格式
输入包含几组测试数据。 每种情况都以包含两个整数1≤n≤1000且1≤m≤1000000的整数行开始。 数字n是骑士的数量。 接下来的m行描述哪个骑士讨厌哪个骑士。 这m行中的每一行包含两个整数k1和k2,这意味着骑士数k1和骑士数k2彼此讨厌(数字k1和k2在1和n之间)。
输入由n = m = 0的块终止。
输出格式
对于每组测试数据,您必须在单独的行上输出一个整数:必须被驱逐的骑士数量。
题解
读题发现,题目要求坐在一起的骑士不能相互仇恨。
假如我们给每一对相互仇恨的骑士建边的话,我们需要找出相互之间没有连边的骑士。
这样似乎十分难处理。于是我们建补图(原先有边变无边,无边变有边)。
所以我们需要求出点双。
题目中还有这样一句话“奇数骑士应坐在桌子周围”,所以找奇环,用黑白染色法。(我染的点,听说有大神染的边)
主要要注意的是割点的处理。我们每次把属于该点双的全打上标记就可以了。如果在求点双里直接打标记的话,割点会被多个点双重复标记,处理起来很麻烦。
细节要处理好。
还有,多判要清空哦~
#include<iostream>
#include<cstring>
#include<vector>
#include<cstdio>
#include<cmath>
#include<stack>
#define rint register int
using namespace std;
struct node{int u,v,nxt;}edge[],edgec[];
int n,m,k1,k2,toty,firsty[],dfn[],firstc[];
int low[],cnt,root,newid[],totq,totc,c[],ans;
int belong[],color[];
bool map[][],cut[],vis[];
stack <int> s;vector <int> dcc[];
inline void renew()
{
toty=cnt=root=totq=totc=ans=;
for(rint i=;i<=n;++i)
firsty[i]=dfn[i]=firstc[i]=low[i]=newid[i]=c[i]=belong[i]=,
color[i]=-,cut[i]=vis[i]=false;
for(rint i=;i<=m;++i)edge[i].u=edge[i].v=edge[i].nxt=edgec[i].u=edgec[i].v=edgec[i].nxt=;
memset(map,false,sizeof(map));
}
inline void build_line(int uu,int vv)
{
++toty;edge[toty].u=uu;edge[toty].v=vv;
edge[toty].nxt=firsty[uu];firsty[uu]=toty;
}
inline void add(int uu,int vv)
{
++totc;edgec[totc].u=uu;edgec[totc].v=vv;
edgec[totc].nxt=firstc[uu];firstc[uu]=totc;
}
inline void tarjan(int x)
{
dfn[x]=low[x]=++cnt;s.push(x);
if(x==root && firsty[x]==)
{
dcc[++totq].clear();
dcc[totq].push_back(x);
return ;
}
int flag=;
for(rint i=firsty[x];i;i=edge[i].nxt)
{
int y=edge[i].v;
if(!dfn[y])
{
tarjan(y);low[x]=min(low[x],low[y]);
if(low[y]>=dfn[x])
{
flag++;
if(x!=root||flag>)cut[x]=true;
totq++;int z;
dcc[totq].clear();
do{
z=s.top();s.pop();
dcc[totq].push_back(z);
}while(z!=y);
dcc[totq].push_back(x);
}
}
else low[x]=min(low[x],dfn[y]);
}
}
inline bool dfs(int x,int last)
{
color[x]=color[last]^;
for(rint i=firsty[x];i;i=edge[i].nxt)
{
int y=edge[i].v;
if(!belong[y]||y==last)continue;
if(color[y]!=-&&color[y]==color[x])return true;
if(color[y]==-&&dfs(y,color[x]))return true;
}
return false;
}
int main()
{
while()
{
scanf("%d %d",&n,&m);
if(n==&&m==)return ;
renew();
for(rint i=;i<=m;++i)
{
scanf("%d %d",&k1,&k2);
map[k1][k2]=map[k2][k1]=;
}
for(rint i=;i<=n;++i)
for(rint j=i+;j<=n;++j)
if(!map[i][j]) build_line(i,j),build_line(j,i);
for(rint i=;i<=n;++i)
if(!dfn[i])root=i,tarjan(i);
color[]=;
for(rint i=;i<=totq;++i)
{
for(rint j=;j<dcc[i].size();++j)
belong[dcc[i][j]]=;
if(dfs(dcc[i][],))
for(rint j=;j<dcc[i].size();++j)
vis[dcc[i][j]]=true;
for(rint j=;j<dcc[i].size();++j)
{
if(cut[dcc[i][j]])
color[dcc[i][j]]=-;
belong[dcc[i][j]]=;
}
}
for(rint i=;i<=n;++i)
if(vis[i])ans++;
ans=n-ans;printf("%d\n",ans);
}
return ;
}
「题解」:[POJ2942]Knights of the Round Table的更多相关文章
- 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
题解:http://blog.csdn.net/lyy289065406/article/details/6756821 讲的很详细我就不多说了. 题目连接:http://poj.org/proble ...
- POJ2942 Knights of the Round Table 点双连通分量,逆图,奇圈
题目链接: poj2942 题意: 有n个人,能够开多场圆桌会议 这n个人中,有m对人有仇视的关系,相互仇视的两人坐在相邻的位置 且每场圆桌会议的人数仅仅能为奇书 问有多少人不能參加 解题思路: 首先 ...
- [POJ2942]:Knights of the Round Table(塔尖+二分图染色法)
题目传送门 题目描述 亚瑟王要在圆桌上召开骑士会议,为了不引发骑士之间的冲突,并且能够让会议的议题有令人满意的结果,每次开会前都必须对出席会议的骑士有如下要求: .相互憎恨的两个骑士不能坐在直接相邻的 ...
- POJ2942:Knights of the Round Table
传送门 点双练习. 很简单的一道模板题,建立反图,求出点双,二分图判定奇环. //POJ 2942 //by Cydiater //2016.11.2 #include <iostream> ...
- POJ2942 Knights of the Round Table(点双连通分量 + 二分图染色)
题目大概说要让n个骑士坐成一圈,这一圈的人数要是奇数且大于2,此外有些骑士之间有仇恨不能坐在一起,问有多少个骑士不能入座. 双连通图上任意两点间都有两条不重复点的路径,即一个环.那么,把骑士看做点,相 ...
- poj2942 Knights of the Round Table,无向图点双联通,二分图判定
点击打开链接 无向图点双联通.二分图判定 <span style="font-size:18px;">#include <cstdio> #include ...
- POJ2942 Knights of the Round Table【Tarjan点双联通分量】【二分图染色】【补图】
LINK 题目大意 有一群人,其中有一些人之间有矛盾,现在要求选出一些人形成一个环,这个环要满足如下条件: 1.人数大于1 2.总人数是奇数 3.有矛盾的人不能相邻 问有多少人不能和任何人形成任何的环 ...
- POJ2942 Knights of the Round Table 点双连通分量 二分图判定
题目大意 有N个骑士,给出某些骑士之间的仇恨关系,每次开会时会选一些骑士开,骑士们会围坐在一个圆桌旁.一次会议能够顺利举行,要满足两个条件:1.任意相互憎恨的两个骑士不能相邻.2.开会人数为大于2的奇 ...
随机推荐
- hexo next修改代码区主题,修改字体样式,大小
文章目录 广告 修改代码区主题 站点_config.yml 主题_config.yml 修改字体样式,大小 ps 我自己的方式 广告 本人博客地址:https://mmmmmm.me 源码:https ...
- 面向XX程序设计到底是个啥
面向过程编程:面向(对着)-->过程(流程步骤)-->编程(码代码) IPO是啥 input(输入)-->process(过程处理)-->output(输出) 未来码代码的目的 ...
- drools原生drl规则文件的使用
在初识drools中对drl文件进行了简单的介绍.这里举个例子来具体说明下.主要是写了规则之后我们如何用java代码来run起来. drl文件内容如下: rule "ageUp12" ...
- Xcode常见路径
模拟器安装的位置: /Library/Developer/CoreSimulator/Profiles/Runtimes 可以通过Xcode安装 模拟器程序的沙盒 Xcode编译生成的Product ...
- MySQL数据库之DCL(数据控制语言)
1.MySQL之DCL设置root指定的ip访问 进入mysql:mysql -uroot -p或者mysql -uroot -h127.0.0.1 -p(host默认为127.0.0.1) mysq ...
- 【FHQ-Treap】P4146 序列终结者
题意: 给定一个序列,支持区间加,区间反转,区间max询问 裸的平衡树题,这里采用FHQ-Treap 每个节点多记录一个max值和两个lazy_tag,暴力Push_Down即可(大常数选手) 打完这 ...
- JS随机产生颜色
<script> function selectForm(lowerValue,upperValue){ var choices=upperValue-lowerValue+1; retu ...
- 廖雪峰Java16函数式编程-1Lambda表达式-1Lambda基础
1. 函数式编程 Java有2类方法: 实例方法:通过实例调用 静态方法:通过类名调用 Java的方法相当于过程式语言的函数 函数式编程(Functional Programing): 把函数作为基本 ...
- 视频云肖长杰:视频AI科技助力短视频生态
人工智能技术是当今炙手可热的技术领域,它在制造.家居.零售.交通.安防等行业的应用已经是大势所趋.在本月云栖Techday音视频技术沙龙中,阿里云视频云产品专家肖长杰为我们分享了一些AI技术在视频中应 ...
- Vue+Iview+Node 项目结构和配置
1.项目调整后的目录 api:数据接口定义 assets:静态文件 components:组件 config:项目相关配置 driective:指令 router:路由 store:状态管 ...