尤其是不要谈了些什么,我想A这个问题!

FML啊.....!

题意来自 kuangbin:

亚瑟王要在圆桌上召开骑士会议。为了不引发骑士之间的冲突。 而且可以让会议的议题有令人惬意的结果,每次开会前都必须对出席会议的骑士有例如以下要求: 1、  相互憎恨的两个骑士不能坐在直接相邻的2个位置; 2、  出席会议的骑士数必须是奇数,这是为了让投票表决议题时都能有结果。  

注意:1、所给出的憎恨关系一定是双向的。不存在单向憎恨关系。 2、因为是圆桌会议。则每一个出席的骑士身边必然刚好有2个骑士。

即每一个骑士的座位两边都必然各有一个骑士。 3、一个骑士无法开会,就是说至少有3个骑士才可能开会。  

首先依据给出的互相憎恨的图中得到补图。 然后就相当于找出不能形成奇圈的点。 利用以下两个定理: (1)假设一个双连通分量内的某些顶点在一个奇圈中(即双连通分量含有奇圈)。 那么这个双连通分量的其它顶点也在某个奇圈中; (2)假设一个双连通分量含有奇圈,则他必然不是一个二分图。反过来也成立。这是一个充要条件。

所以本题的做法,就是对补图求点双连通分量。 然后对于求得的点双连通分量,使用染色法推断是不是二分图,不是二分图。这个双连通分量的点是能够 存在的 */

这样,思路例如以下:

1.找出全部的双连通分量;

2.推断找出的双联通分量似不似一个二分图,假设是二分图,说明它不含有奇圈,不符合题意,反之符合题意,所以在该连通分量中的点都是能够上桌开会的点...

详细思路就是这个样子了~然后照着刘汝佳大白书上的 找双联通分量 的算法,以及 染色法判二分图 的方法,就ok了

没有办法。太水了我仅仅能理解到这里才干做题了尼玛啊 !

T_T.....

没有大神讲,变量的意思想了一上午卧槽好傻逼。

。。

接下来会有一篇给一些变量凝视的!

大白书上的代码。造福弱逼不用谢。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <vector>
  4. #include <stack>
  5. using namespace std;
  6.  
  7. const int N = 1005;
  8.  
  9. struct Edge {
  10. int u, v;
  11. Edge() {}
  12. Edge(int u, int v) {
  13. this->u = u;
  14. this->v = v;
  15. }
  16. };
  17. ///bccno[]是用来表示 编号为i的点在哪一个双连通分量中!
  18.  
  19. ///bcc_cnt是用来表示 总共同拥有几个双连通分量
  20. int pre[N], bccno[N], dfs_clock, bcc_cnt;
  21. bool iscut[N];
  22.  
  23. vector<int> g[N], bcc[N];///用来存下来每个双连通分量
  24. stack<Edge> S;
  25.  
  26. int dfs_bcc(int u, int fa) {
  27. int lowu = pre[u] = ++dfs_clock;
  28. int child = 0;
  29. for (int i = 0; i < g[u].size(); i++) {
  30. int v = g[u][i];
  31. Edge e = Edge(u, v);
  32. if (!pre[v]) {
  33. S.push(e);
  34. child++;
  35. int lowv = dfs_bcc(v, u);
  36. lowu = min(lowu, lowv);
  37. if (lowv >= pre[u]) {
  38. iscut[u] = true;
  39. bcc_cnt++; bcc[bcc_cnt].clear(); //start from 1
  40. while(1) {
  41. Edge x = S.top(); S.pop();
  42. if (bccno[x.u] != bcc_cnt) {bcc[bcc_cnt].push_back(x.u); bccno[x.u] = bcc_cnt;}
  43. if (bccno[x.v] != bcc_cnt) {bcc[bcc_cnt].push_back(x.v); bccno[x.v] = bcc_cnt;}
  44. if (x.u == u && x.v == v) break;
  45. }
  46. }
  47. } else if (pre[v] < pre[u] && v != fa) {
  48. S.push(e);
  49. lowu = min(lowu, pre[v]);
  50. }
  51. }
  52. if (fa < 0 && child == 1) iscut[u] = false;
  53. return lowu;
  54. }
  55.  
  56. void find_bcc(int n) {
  57. memset(pre, 0, sizeof(pre));
  58. memset(iscut, 0, sizeof(iscut));
  59. memset(bccno, 0, sizeof(bccno));
  60. dfs_clock = bcc_cnt = 0;
  61. for (int i = 0; i < n; i++)
  62. if (!pre[i]) dfs_bcc(i, -1);
  63. }
  64.  
  65. int odd[N], color[N];
  66.  
  67. bool bipartite(int u, int b) {
  68. for (int i = 0; i < g[u].size(); i++) {
  69. int v = g[u][i]; if (bccno[v] != b) continue;
  70. if (color[v] == color[u]) return false;
  71. if (!color[v]) {
  72. color[v] = 3 - color[u];
  73. if (!bipartite(v, b)) return false;
  74. }
  75. }
  76. return true;
  77. }
  78.  
  79. int n, m, A[N][N];
  80.  
  81. int main() {
  82. int cas = 0;
  83. while (~scanf("%d%d", &n, &m) && n) {
  84. for (int i = 0; i < n; i++) g[i].clear();
  85. memset(A, 0, sizeof(A));
  86. for (int i = 0; i < m; i++) {
  87. int u, v;
  88. scanf("%d%d", &u, &v); u--; v--;
  89. A[u][v] = A[v][u] = 1;
  90. }
  91. for (int u = 0; u < n; u++) {
  92. for (int v = u + 1; v < n; v++)
  93. if (!A[u][v]) {
  94. g[u].push_back(v);
  95. g[v].push_back(u);
  96. }
  97. }
  98. find_bcc(n);
  99. memset(odd, 0, sizeof(odd));
  100. for (int i = 1; i <= bcc_cnt; i++) {
  101. memset(color, 0, sizeof(color));
  102. for (int j = 0; j < bcc[i].size(); j++) bccno[bcc[i][j]] = i;
  103. int u = bcc[i][0];
  104. color[u] = 1;
  105. if (!bipartite(u, i)) {
  106. for (int j = 0; j < bcc[i].size(); j++)
  107. odd[bcc[i][j]] = 1;
  108. }
  109. }
  110. int ans = n;
  111. for (int i = 0; i < n; i++)
  112. ans -= odd[i];
  113. printf("%d\n", ans);
  114. }
  115. return 0;
  116. }

版权声明:请注明出处撒...http://blog.csdn.net/u013382399

UVA 1364 - Knights of the Round Table (获得双连接组件 + 二部图推理染色)的更多相关文章

  1. 【POJ 2942】Knights of the Round Table(双联通分量+染色判奇环)

    [POJ 2942]Knights of the Round Table(双联通分量+染色判奇环) Time Limit: 7000MS   Memory Limit: 65536K Total Su ...

  2. POJ2942 Knights of the Round Table[点双连通分量|二分图染色|补图]

    Knights of the Round Table Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 12439   Acce ...

  3. 【POJ】2942 Knights of the Round Table(双连通分量)

    http://poj.org/problem?id=2942 各种逗.... 翻译白书上有:看了白书和网上的标程,学习了..orz. 双连通分量就是先找出割点,然后用个栈在找出割点前维护子树,最后如果 ...

  4. uva 3523 Knights of the Round Table

    题意:给你n,m n为有多少人,m为有多少组关系,每组关系代表两人相互憎恨,问有多少个骑士不能参加任何一个会议. 白书算法指南 对于每个双联通分量,若不是二分图,就把里面的节点标记 #include ...

  5. POJ 2942 Knights of the Round Table(双连通分量)

    http://poj.org/problem?id=2942 题意 :n个骑士举行圆桌会议,每次会议应至少3个骑士参加,且相互憎恨的骑士不能坐在圆桌旁的相邻位置.如果意见发生分歧,则需要举手表决,因此 ...

  6. POJ 2942.Knights of the Round Table (双连通)

    简要题解: 意在判断哪些点在一个图的  奇环的双连通分量内. tarjan求出所有的点双连通分量,再用二分图染色判断每个双连通分量是否形成了奇环,记录哪些点出现在内奇环内 输出没有在奇环内的点的数目 ...

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

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

  8. poj 2942 Knights of the Round Table(点双连通分量+二分图判定)

    题目链接:http://poj.org/problem?id=2942 题意:n个骑士要举行圆桌会议,但是有些骑士相互仇视,必须满足以下两个条件才能举行: (1)任何两个互相仇视的骑士不能相邻,每个骑 ...

  9. UVALive-3523 Knights of the Round Table (双连通分量+二分图匹配)

    题目大意:有n个骑士要在圆桌上开会,但是相互憎恶的两个骑士不能相邻,现在已知骑士们之间的憎恶关系,问有几个骑士一定不能参加会议.参会骑士至少有3个且有奇数个. 题目分析:在可以相邻的骑士之间连一条无向 ...

随机推荐

  1. Mac maven环境变量配置

    近期一直在学习使用Macbook,在这里记录一下全部遇到的问题 问题起源: 1.Macbook 安装了Eclipse,Eclipse装入插件maven & git , 可是在git中clone ...

  2. Android 之流媒体播放器,广播侧下方这么简单。

    没有其他的.希望从事流媒体开发案例.还承诺提供朋友博客.上个星期.制定出最后一点机会. 在这里,与大家分享. 首先要明白的概念:什么是流媒体?转载请注明出处http://blog.csdn.net/g ...

  3. Shiro学习笔记(5)——web集成

    Web集成 shiro配置文件shiroini 界面 webxml最关键 Servlet 測试 基于 Basic 的拦截器身份验证 Web集成 大多数情况.web项目都会集成spring.shiro在 ...

  4. 经典排序算法 - 归并排序Merge sort

    经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到所有合并完,形成有序的数组 举例 无序数组[6 2 ...

  5. MIT 操作系统实验 MIT JOS lab2

    MIT JOS lab2 首先把内存分布理清楚,由/boot/main.c可知这里把kernel的img的ELF header读入到物理地址0x10000处 这里能够回想JOS lab1的一个小问.当 ...

  6. WPF 3D 常用类(1)

    原文:WPF 3D 常用类(1) 几何数据相关类 Geometry3D 抽象类, 用于定义物体的几何数据, 可用于计算HitTest和BoundingBox MeshGeometry3D Geomet ...

  7. Spring它不支持依赖注入static静态变量

    在springframework在,我们不能@Autowired静态变量,制作spring bean,例如,没有那么: @Autowired private static YourClass your ...

  8. 自己定义actionbar

    android中的actionbar可提供自己定义view.详细是先写好自己定义view的布局,然后在代码中获取Actionbar对象.调用 setCustomView方法. 可是这样,它还是会显示前 ...

  9. WebxFrameworkFilter 请求响应过程

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTFRpYW5jaGFv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...

  10. [LeetCode53]Maximum Subarray

    问题: Find the contiguous subarray within an array (containing at least one number) which has the larg ...