正题

题目链接:http://poj.org/problem?id=2942


题目大意

有nnn个骑士,有mmm组讨厌关系,要求讨厌的不能坐相邻,而且要求每次会有都有奇数个人,求有多少个骑士一组会议都不能参加。


解题思路

首先构一个补图,然后求有多少个点没有被任何一个奇环包围。

推论1:如果两个点不在同一个点双联通分量内,那么这两个点不可能在一个奇环内
证明:显然

推论2:如果一个点双联通分量中有奇环,那么这个点双中任何一个点都至少在一个奇环内。
证明:必定可以找到两个点,若这两个点到xxx的距离和为奇数,那么就选择奇数的弧,否则选择偶数的弧。

所以求出点双后在每个点双中用二分图染色找奇环


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<stack>
using namespace std;
const int N=1100;
struct node{int to,next;
}a[N*N*2];
int n,m,cnt,tot,num,root,ans;
int ls[N],c[N],dfn[N],low[N];
bool ft[N][N],v[N],k[N],flag;
vector<int> dcc[N];
stack<int> S;
void addl(int x,int y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;
}
void tarjan(int x){dfn[x]=low[x]=++cnt;S.push(x);if(x==root&&!ls[x]){dcc[++num].push_back(x);return;}for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(!dfn[y]){tarjan(y);low[x]=min(low[x],low[y]);if(low[y]>=dfn[x]){int z;++num;do{z=S.top();S.pop();dcc[num].push_back(z);}while(z!=y);dcc[num].push_back(x);}}else low[x]=min(low[x],dfn[y]);}return;
}
void dfs(int x,int col){c[x]=col;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(!v[y])continue;if(c[y]&&c[y]==col){flag=1;return;}if(!c[y])dfs(y,3-col);}return;
}
int main()
{while(1){scanf("%d%d",&n,&m);if(!n&&!m)break;tot=num=cnt=ans=0;for(int i=1;i<=n;i++)dcc[i].clear();for(int i=1;i<=n;i++){v[i]=k[i]=dfn[i]=low[i]=c[i]=ls[i]=0;for(int j=1;j<=n;j++)ft[i][j]=0;}for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);ft[x][y]=ft[y][x]=1;}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(!ft[i][j]&&i!=j)addl(i,j);for(int i=1;i<=n;i++)if(!dfn[i])root=i,tarjan(i);for(int i=1;i<=num;i++){for(int j=0;j<dcc[i].size();j++)v[dcc[i][j]]=1;flag=0;if(dcc[i].size())dfs(dcc[i][0],1);if(flag)for(int j=0;j<dcc[i].size();j++)k[dcc[i][j]]=1;for(int j=1;j<=n;j++)v[j]=c[j]=0;}for(int i=1;i<=n;i++)if(!k[i])ans++;printf("%d\n",ans);}return 0;
}

POJ2942-Knights of the Round Table【tarjan】相关推荐

  1. POJ2942 Knights of the Round Table 点双连通分量,逆图,奇圈

    题目链接: poj2942 题意: 有n个人,能够开多场圆桌会议 这n个人中,有m对人有仇视的关系,相互仇视的两人坐在相邻的位置 且每场圆桌会议的人数仅仅能为奇书 问有多少人不能參加 解题思路: 首先 ...

  2. POJ2942 Knights of the Round Table 点双连通分量 二分图判定

    题目大意 有N个骑士,给出某些骑士之间的仇恨关系,每次开会时会选一些骑士开,骑士们会围坐在一个圆桌旁.一次会议能够顺利举行,要满足两个条件:1.任意相互憎恨的两个骑士不能相邻.2.开会人数为大于2的奇 ...

  3. POJ 2942 Knights of the Round Table 【点双联通 + 二分图染色法判奇环】

    传送门 亚瑟王要在圆桌上召开骑士会议,为了不引发骑士之间的冲突,并且能够让会议的议题有令人满意的结果,每次开会前都必须对出席会议的骑士有如下要求: 1. 相互憎恨的两个骑士不能坐在直接相邻的2个位置: ...

  4. [POJ2942]:Knights of the Round Table(塔尖+二分图染色法)

    题目传送门 题目描述 亚瑟王要在圆桌上召开骑士会议,为了不引发骑士之间的冲突,并且能够让会议的议题有令人满意的结果,每次开会前都必须对出席会议的骑士有如下要求: 1.相互憎恨的两个骑士不能坐在直接相邻 ...

  5. POJ2942 UVA1364 Knights of the Round Table 圆桌骑士

    POJ2942 洛谷UVA1364(博主没有翻墙uva实在是太慢了) 以骑士为结点建立无向图,两个骑士间存在边表示两个骑士可以相邻(用邻接矩阵存图,初始化全为1,读入一对憎恨关系就删去一条边即可),则 ...

  6. 【POJ - 2942】Knights of the Round Table(点双连通分量,二分图判断奇环奇圈)

    题干: Being a knight is a very attractive career: searching for the Holy Grail, saving damsels in dist ...

  7. UVA1364 Knights of the Round Table(双连通分量、二分图染色,超详细解释)

    整理的算法模板合集: ACM模板 UVA1364 Knights of the Round Table 题目中要求互相有憎恨关系的人不能坐在相邻的位置,一个圆桌可以很形象地看作是一个环,也就是说我们两 ...

  8. 如果圆桌骑士有特殊情况(Knights of the Round Table)

    题目描述 Being a knight is a very attractive career: searching for the Holy Grail, saving damsels in dis ...

  9. 【gmoj】 【tarjan】 【拓扑】 【并查集】 QYQ在艾泽拉斯

    [gmoj] [tarjan] [拓扑][并查集] QYQ在艾泽拉斯 题目 解题思路 因为可能出现环用tarjan缩点 再建一个新图 用按拓扑序跑一边DP 求出一个连通块中从哪个点跑出来的价值最大 k ...

最新文章

  1. 世上最伟大的十个公式,1+1=2排名第七,质能方程排名第五
  2. 这是一篇工程师对产品经理的吐槽
  3. 14、四大组件--Service
  4. 47. 全排列 II(回溯算法)
  5. 参与 Apache 顶级开源项目的 N 种方式,Apache Dubbo Samples SIG 成立!
  6. Web三个域对象的区别
  7. YUV格式学习:YUV444转换RGB24
  8. python转义例题_笨办法学Python记录--习题37 异常,lambda,yield,转义序列
  9. 通过wifi上网,桥接模式下virtualBox虚拟机无法连上网的解决办法
  10. jquery元素插入、删除、清空
  11. javascript 组成
  12. qtableview及自定义model的使用,对比qtablewidget性能及内存优化
  13. 程序员的炫酷动态科幻桌面壁纸
  14. RS-485接口(上下拉电阻选择等)分析
  15. 用友NC系统与一卡通集成解决方案
  16. 属性基加密仿真及代码实现(CP-ABE)论文:Ciphertext-Policy Attribute-Based Encryption
  17. EasyExcel读写Excel
  18. 上海交通大学计算机学院录取分数线,湖南省多少名可以进上海交大?附上海交通大学近三年录取分数线...
  19. 软件算法一些学习总结
  20. 超实用!年薪40W的项目经理都在用的6个项目管理软件

热门文章

  1. mysql连接指定时区_MySQL创建JDBC连接时区问题
  2. camunda流程定义表无数据_[Python04] 学习snakemake,三步轻松搭建生信流程!
  3. 各高校寒假时间公布_高校放假哪家长?多所高校寒假时间公布!
  4. lunixs 常用命令c语言,常用Lunix命令 - osc_271igh42的个人空间 - OSCHINA - 中文开源技术交流社区...
  5. ccs加载out文件_类加载流程、类加载机制及自定义类加载器详解
  6. 数据结构——基于字符串模式匹配算法的病毒感染检测
  7. [Java基础]IO流概述和分类
  8. LeetCode 404左叶子之和-简单
  9. List(C++模版实现的带哨兵的双向链表)
  10. 数据结构与算法--B树原理及实现