【问题描述】
 
  有n个骑士经常举行圆桌会议,商讨大事。每次圆桌会议至少有3个骑士参加,且相互憎恨的骑士不能坐在圆桌的相邻位置。如果发生意见分歧,则需要举手表决,因此参加会议的骑士数目必须是大于1的奇数,以防止赞同和反对票一样多。知道那些骑士相互憎恨之后,你的任务是统计有多少骑士不可能参加任何一个会议。
 
【输入格式】
 
  第一行为两个整数n和m。
  以下m行每行包含两个整数k1和k2(1<=k1,k2<=n),表示骑士k1和k2相互憎恨。
 
【输出格式】
 
  对于每组数据,在一行中输出一个整数,即无法参加任何会议的骑士个数。
 
【输入样例】
 
5 5
1 4
1 5
2 5
3 4
4 5
 
【输出样例】
 
2
 
【数据范围】
 
1<=n<=1000,1<=m<=10^6

1.分析一下可以得知,这个题要求点双联通分量;

2.可以分几桌开会,不一定一张桌子,也就是说给的图不一定每个点联通;

3.可以相邻坐的骑士之间连一条边,则就是求这样连边后的分量;

4.因为不能出现投票两边人数相等,所以只有点数为奇数的分量才可以(奇圈);

5.根据二分图的性质,有奇数个点的分量不是二分图,所以可以利用这个性质来判断是不是二分图,即是不是奇圈;

6.注意,每个割顶可能属于多个分量,故每个分量单独处理;

很丑的代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1005;
const int maxm=1000005;//last2用于存连通分量
int n,m,np=0,last[maxn],last2[maxn],np2=0,rela[maxn][maxn],belong[maxn],color[maxn],ok[maxn];
struct edge{int v,id,pre;}E[maxm*2];
struct Myvector{int num,pre;}bcc[maxn*2];//链表代替vector inline void addedge(int u,int v,int id)
{E[++np]=(edge){v,id,last[u]};last[u]=np;
}inline void add_bcc(int u,int v)
{bcc[++np2]=(Myvector){v,last2[u]};last2[u]=np2;
}char  c;
inline void qkscanf(int &x)
{for(c=getchar();c<'0'||c>'9';c=getchar());for(x=0;c>='0'&&c<='9';c=getchar()) x=x*10+c-'0';
}int low[maxn],dfn[maxn],dfs_clock=0,bcc_cnt=0,stk[maxn],top=0;
inline void DFS(int i,int fd)
{low[i]=dfn[i]=++dfs_clock;stk[++top]=i;for(int p=last[i];p;p=E[p].pre){int j=E[p].v,id=E[p].id;if(dfn[j]){if(dfn[j]<dfn[i]&&id!=fd) low[i]=min(low[i],dfn[j]);continue;}DFS(j,id);low[i]=min(low[i],low[j]);if(low[j]>=dfn[i]){bcc_cnt++;add_bcc(bcc_cnt,i);while(1){int x=stk[top--];add_bcc(bcc_cnt,x);if(x==j) break;}}}
}bool bipart(int i)
{for(int p=last[i];p;p=E[p].pre){int j=E[p].v;if(belong[j]!=belong[i]) continue;if(color[j]==color[i]) return false;if(!color[j]){color[j]=3-color[i];if(!bipart(j)) return false;}}return true;
}int main()
{
//  freopen("in.txt","r",stdin);//建边 qkscanf(n);qkscanf(m);int u,v;for(int i=1;i<=m;i++){qkscanf(u);qkscanf(v);rela[u][v]=1;rela[v][u]=1;}int k=0;for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){if(!rela[i][j]){k++; addedge(i,j,k);addedge(j,i,k);}}}//判断连通分量 for(int i=1;i<=n;i++) if(!dfn[i]) DFS(i,0);//判断二分图for(int i=1;i<=bcc_cnt;i++){memset(color,0,sizeof(color));for(int p=last2[i];p;p=bcc[p].pre){int j=bcc[p].num;belong[j]=i;}//这一步主要是因为割顶属于多个分量,所以处理一下 int root=bcc[last2[i]].num;//随便取一个i分量的点,从它开始判定 color[root]=1;if(!bipart(root))//不是二分图 {for(int p=last2[i];p;p=bcc[p].pre){int j=bcc[p].num;ok[j]=1;//标记 }}}//统计答案int ans=n;for(int i=1;i<=n;i++) if(ok[i]) ans--;printf("%d",ans);return 0;
}

圆桌骑士(点双联通分量+二分图判定)相关推荐

  1. poj2942(双联通分量,交叉染色判二分图)

    题意:一些骑士,他们有些人之间有矛盾,现在要求选出一些骑士围成一圈,圈要满足如下条件:1.人数大于1.2.总人数为奇数.3.有仇恨的骑士不能挨着坐.问有几个骑士不能和任何人形成任何的圆圈. 思路:首先 ...

  2. POJ - 2942 Knights of the Round Table(点双缩点+二分图判定)

    题目链接:点击查看 题目大意:国王要在圆桌上召开骑士会议,但是有若干对骑士之间互相憎恨.出于各种各样奇怪的原因,每次开会都必须有以下要求: 相互憎恨的两个骑士不能坐在相邻的两个位置 为了让投票表决议题 ...

  3. 『Tarjan算法 无向图的双联通分量』

    无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被 ...

  4. 【9.22校内测试】【可持久化并查集(主席树实现)】【DP】【点双联通分量/割点】...

    1 build 1.1 Description 从前有一个王国,里面有n 座城市,一开始两两不连通.现在国王将进行m 次命令,命令可 能有两种,一种是在u 和v 之间修建道路,另一种是询问在第u 次命 ...

  5. lightoj 1300 边双联通分量+交叉染色求奇圈

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1300 边双连通分量首先dfs找出桥并标记,然后dfs交叉着色找奇圈上的点.这题只要求在 ...

  6. POJ-3352-RoadConstruction(边双联通分量,缩点)

    链接:https://vjudge.net/problem/POJ-3352#author=0 题意: 给一个无向连通图,至少添加几条边使得去掉图中任意一条边不改变图的连通性(即使得它变为边双连通图) ...

  7. 10.31T2 点双联通分量+预处理前缀+二分答案

    2.逛公园I  (parka) [问题描述] 琥珀色黄昏像糖在很美的远方,思念跟影子在傍晚一起被拉长--       小 B 带着 GF 去逛公园,公园一共有 n 个景点,标号为 1 . . . n. ...

  8. HDU4612 Warm up —— 边双联通分量 + 重边 + 缩点 + 树上最长路

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4612 Warm up Time Limit: 10000/5000 MS (Java/Ot ...

  9. 【BZOJ2959】【codevs2002】长跑,维护双联通分量

    传送门1 传送门2 思路: 思路巧妙的一道数据结构 题意就是让你维护双联通分量 我一开始的想法是写两个并查集来分别维护连通性和双联通分量里的点,然后通过LCT来维护权值和,但我发现缩点时不是很好搞,而 ...

最新文章

  1. 用UltraISO制作Ubuntu20.04 U盘启动盘
  2. 2020蓝桥杯省赛---java---B---2(寻找 2020)+测试txt
  3. 关于一个跨域的小问题
  4. php dom xml解析,PHP使用DOM解析XML
  5. SpringBoot整合JDBC数据库操作第二弹-配置基本数据库连接源
  6. 文件大小超过配置限制(2560000),代码洞察功能不可用怎么办?
  7. Cadence Orcad Capture在元件库中修改默认封装图文视频教程
  8. easyui datagrid一般创建模板
  9. 【vpn异地组网专题】爱快ikuai软路由-VM虚拟机安装教程
  10. ip地址与交换机工作原理
  11. 家乡の战队实训项目博客二
  12. 虚拟机的网络改为桥接网络
  13. shadertoy 实现简易指南针
  14. Unity的UGUI使用Text和Image实现文字下划线
  15. 输入5个学生某门课程的成绩(用一维数组表示),分别用函数实现下列功能:
  16. SPH模拟超高速碰撞——基于Ls-Prepost和Ls-Dyna
  17. linux shell tr命令,shell脚本中的tr用法
  18. 《软件研发之道:微软开发团队的经验法则》目录
  19. 哈尔滨理工大学第五届ACM程序设计竞赛(热身)
  20. JSON压缩:JSONMinify

热门文章

  1. FlinkSQL to Kafka连接器报错:could not find any factory for identifier ‘kafka‘ that implements
  2. Add/SubtractWorkingDaystoaDate_SAP刘梦_新浪博客
  3. cmnet是什么 cmnet是什么意思?cmnet和cmwap的区别在哪里
  4. 移动端Web不安分的小键盘
  5. Qt Creator 中使用VLD检测内存泄漏
  6. “记忆力争夺战”走向尾声,“潜意识记忆营销”将成破局利器
  7. pathlib库使用手册
  8. bootstrap-select 插件示例
  9. 树莓派 Install Home Assistant Core
  10. CMake:aux_source_directory