题目大意:有n个骑士经常举行圆桌会议,每次圆桌会议至少要有3个骑士参加(且每次参加的骑士数量是奇数个),且所有互相憎恨的骑士不能坐在圆桌旁的相邻位置,问有多少个骑士不可能参加任何一个会议
思路,首先根据给出的憎恨图得出补图,然后就是找出不能形成奇圈的点
利用下面二个定理:
1.如果一个双连通分量的某些顶点在一个奇圈中(即双连通分量含有奇圈),那么这个双连通分量的其他顶点也在这个奇圈中
2.如果一个双连通分量含有奇圈,那么他必然不是一个二分图,反过来也成立,这是一个充要条件做法是对补图求出点双连通分量,使用染色法判断是不是二分图,不是二分图,这个双连通分量的点是可以存在的
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<vector>
#include<algorithm>
#include<stack>
#include<map>using namespace std;typedef long long LL;
const int maxn = 1e3 + 10;
const int maxm = 2e6 + 10;int pre[maxn],iscut[maxn],bccno[maxn];
int dfs_clock,bcc_cnt;
///bccno[] 是每个节点所属的双联通分量编号
///bcc_cnt是双连通分量的个数
vector<int> G[maxm],bcc[maxn];
///bcc[]数组记录了每一支双连通分量
struct Edge
{int u,v;
};
stack<Edge> S;
int A[maxn][maxn];int color[maxn];///初始化为0,1代表白色2代表黑色
int odd[maxn];///奇圈///判断节点u所在的连通分量是否为二分图
///总是假定结点0为黑色
bool bipartite(int u,int b)
{for(int i =0;i<G[u].size();i++)///枚举每条边(u,v){int v = G[u][i];if(bccno[v]!=b) continue;if(color[v] == color[u])///V节点已经着色,并且颜色有冲突{return false;}if(!color[v])///如果节点没有访问过{color[v]  = 3-color[u];///给节点v着上和U相反的颜色if(!bipartite(v,b)) return false;}}return true;
}
int dfs(int u,int fa)
{int lowu = pre[u] = ++dfs_clock;int child = 0;for(int i = 0;i<G[u].size();i++){int v = G[u][i];Edge e = (Edge){u,v};if(!pre[v]){S.push(e);child++;int lowv = dfs(v,u);lowu = min(lowu,lowv);if(lowv>=pre[u]){iscut[u] = true;bcc_cnt++;bcc[bcc_cnt].clear();///bcc数组从1开始for(;;){Edge x = S.top();S.pop();if(bccno[x.u]!=bcc_cnt){bcc[bcc_cnt].push_back(x.u);bccno[x.u] = bcc_cnt;}if(bccno[x.v]!=bcc_cnt){bcc[bcc_cnt].push_back(x.v);bccno[x.v] = bcc_cnt;}if(x.u==u&&x.v==v) break;}}}else if(pre[v]<pre[u]&&v!=fa){S.push(e);lowu = min(lowu,pre[v]);}}if(fa<0&&child==1){iscut[u] = 0;}return lowu;
}
void find_bcc(int n)
{memset(pre,0,sizeof(pre));memset(iscut,0,sizeof(iscut));memset(bccno,0,sizeof(bccno));dfs_clock = bcc_cnt = 0;for(int i = 0;i<n;i++){if(!pre[i]){dfs(i,-1);///fa的值应该等于负数}}
}
void solve()
{int n,m;while(scanf("%d%d",&n,&m)==2){if(n==0&&m==0) break;for(int i =0;i<n;i++) G[i].clear();memset(A,0,sizeof(A));for(int i = 0;i<m;i++){int x,y;scanf("%d%d",&x,&y);A[x][y] = A[y][x] = 1;}for(int u = 1;u<=n;u++){for(int v = u+1;v<=n;v++){if(!A[u][v]){G[u].push_back(v);G[v].push_back(u);}}}find_bcc(n);memset(odd,0,sizeof(odd));for(int i = 1;i<=bcc_cnt;i++){memset(color,0,sizeof(color));for(int j =0;j<bcc[i].size();j++){bccno[bcc[i][j]] = i;}///主要是处理割顶int u = bcc[i][0];color[u] = 1;if(!bipartite(u,i)){for(int j= 0;j<bcc[i].size();j++){odd[bcc[i][j]] = 1;}}}int ans = n;for(int i = 0;i<n;i++){if(odd[i]) ans--;}printf("%d\n",ans);}
}
int main()
{solve();return 0;
}

UVALive 3523 圆桌骑士相关推荐

  1. LA 3523 圆桌骑士

    题目链接:http://vjudge.net/contest/141787#problem/A http://poj.org/problem?id=2942 此题很经典 知识点:DFS染色,点-双连通 ...

  2. LA 3523 圆桌骑士 (双连通)

    题目大意:n个骑士参加会议,互相怨恨的不能够坐在一起.会议至少要有3人参加并且参加会议的人数为奇数.问有多少个骑士不能参加任何会议. 本质就是求不在任何一个奇圈上的节点个数. 二分图一定不含奇圈. 非 ...

  3. 圆桌骑士 图的连通性

    题目描述 圆桌骑士是一个非常吸引人的职业.因此,在最近几年里,亚瑟王史无前例的扩招圆桌骑士,并不令人惊讶.现在这里有许多圆桌骑士,每个圆桌骑士都收到一份珍贵的邀请函,被邀请去英灵殿圆桌.这些骑士将要环 ...

  4. 强连通分量 圆桌骑士

    题目描述 圆桌骑士是一个非常吸引人的职业.因此,在最近几年里,亚瑟王史无前例的扩招圆桌骑士,并不令人惊讶.现在这里有许多圆桌骑士,每个圆桌骑士都收到一份珍贵的邀请函,被邀请去英灵殿圆桌.这些骑士将要环 ...

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

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

  6. POJ 2942 圆桌骑士 (点双学习笔记)

    割点 在无向连通图G上进行如下定义: • 割点:若删掉某点P后,G分裂为两个或两个以上的子图,则称P为G的割点. • 割点集合:在无向连通图G中,如果有一个顶点集合,删除这个顶点集合以及与该点集中 的 ...

  7. 以圆桌骑士为例浅尝HTML5游戏开发

    随着XHTML的逐渐式微,Chrome,Safari,FireFox,Opera等现代浏览器正在积极完善HTML5实现,IE9也加入到标准的行列并将在今年上半年发布正式版,HTML5时代来临了. 在各 ...

  8. 网页中在线玩圆桌骑士

    演示一个在网页中在线玩街机游戏圆桌骑士的代码: http://www.return8090.com

  9. JS版圆桌骑士DEMO

    同学们,我参加了IE9开发大赛,作品是网页版圆桌骑士,喜欢的话帮忙投票吧! [url=http://ie9.onlinevoc.cn/contest/PercodPage.aspx?ID=43]htt ...

最新文章

  1. Vue.js下拉框-详细省市联动示例
  2. IMAP 称作交互邮件访问协议
  3. 如何正确访问Redis中的海量数据?服务才不会挂掉!
  4. 控制台下修改系统驱动状态的代码
  5. 【入门1】顺序结构 (今天刷洛谷了嘛)
  6. http response 返回 没有内容_HTTP 教程2
  7. 《Cortex-M0权威指南》之体系结构---存储器系统
  8. 加州理工学院公开课:机器学习与数据挖掘_神经网络
  9. Struts2文件配置 登陆页面
  10. 绝对路径、相对路径详解
  11. 灵雀云CTO陈恺:从“鸿沟理论”看云原生,哪些技术能够跨越鸿沟?
  12. 文献阅读(167)NoC神经网络加速器
  13. 手机python3.0编程软件-QPython3手机版下载
  14. jstree中文github文档
  15. Python 1-02 基础语法
  16. 微信支付宝用二维码支付服务谁能征服世界
  17. 黑客挂马紧盯娃娃 儿童节育儿教育网站被挂马
  18. 2018 年百度校招笔试题详解
  19. 我的小游戏——贪吃蛇
  20. PHP处理字符中的emoji表情

热门文章

  1. 程序人生:Facebook的23岁创始人
  2. 《大话西游》你真的看懂了吗,kotlin命令行编译
  3. 视觉SLAM笔记(53) g2o 操作后端优化
  4. 【源代码】一键分享各个社交平台_android
  5. 艺术家与AI研究者的跨界碰撞丨记青源Workshop「AI+艺术」研讨会(2022年第10期)...
  6. 鸿蒙系统第二批升级时间表,鸿蒙系统2.0什么时候可以升级 鸿蒙系统2.0升级时间介绍...
  7. 4417. 神奇的字符串
  8. 红黄绿小灯泡标记实现
  9. 东半球最先进的debug技巧
  10. CPU GPU设计工作原理