整理的算法模板合集: ACM模板


UVA1364 Knights of the Round Table

题目中要求互相有憎恨关系的人不能坐在相邻的位置,一个圆桌可以很形象地看作是一个环,也就是说我们两个人相互憎恨,所以我们两个人不能直接相邻,放到图里面也就是不能直接相连,但是却可以在同一个圆桌上 ——可以在同一个环里。因此,我们可以将相互之间没有憎恨关系的人连接一条无向边,代表这样是有可能同时参加会议的。那么如果形成了一个点双连通分量,那么说明这个连通分量里的点都是可以同时参加一个圆桌会议的。(因为相互憎恨的人因为不能坐在相邻的位置所以不练边,那么整个连通块里(环)左右相邻(直接有连边)的一定是不相互憎恨的,也就意味着这个连通块里(环)是可以同时参加一个圆桌会议的)

然后再考虑第二个条件,一个圆桌会议必须有奇数个人参加,所以我们需要判断一个环是不是奇数个点。我们发现这个连通块(环)里每个人只与另外两个人连边,所以我们发现可能是一个二分图,而二分图存在的性质就是有没有奇环,所以我们用染色法判断一下这个连通块是不是二分图,如果不是的话说明有奇环,说明是有奇数个点,说明是可以参加圆桌会议的,那么我们把所有的连通块(也就是所有的圆桌会议)中不是奇环的,也就是能参加圆桌会议的人都标记一下,那么所有没有没标记过的点就都是不可能参加会议的人,也就是答案。

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
typedef long long ll;
const int N = 5007, M = 500007, INF = 0x3f3f3f3f;
const double eps = 1e-6;int head[N], ver[M], nex[M], tot;
int dfn[N], tim, low[N];
int n, m;
int stk[N], top;
int dcc_cnt;
int color[N];
bool flag;
vector<int>dcc[N];
int now;
int able[N];
int vis[N];
int hate[N][N];void add(int x, int y)
{ver[tot] = y;nex[tot] = head[x];head[x] = tot ++ ;
}
//无向图的点双连通分量
void tarjan(int x, int root)
{dfn[x] = low[x] = ++ tim;stk[++ top] = x;if(x == root && head[x] == -1){//孤立点dcc[ ++ dcc_cnt].push_back(x);return ;}for(int i = head[x]; ~i; i = nex[i]){int y = ver[i];if(!dfn[y]){tarjan(y, root);low[x] = min(low[x], low[y]);if(dfn[x] <= low[y]){++ dcc_cnt;int z;do{z = stk[top -- ];dcc[dcc_cnt].push_back(z);}while(y != z);dcc[dcc_cnt].push_back(x);}}else low[x] = min(low[x], dfn[y]);}
}void dfs(int x, int co)
{color[x] = co;for(int i = head[x]; ~i; i = nex[i]){int y = ver[i];if(vis[y] != now)continue;if(color[y] && color[y] == co){flag = 1;return ;}if(!color[y]){dfs(y, 3 - co);}}
}void init()
{memset(head, -1, sizeof head);memset(dfn, 0, sizeof dfn);dcc_cnt = tim = tot = 0;memset(able, 0, sizeof able);memset(hate, 0, sizeof hate);memset(vis, 0, sizeof vis);for(int i = 1; i <= n; ++ i)dcc[i].clear();
}int main()
{while(scanf("%d%d", &n, &m) != EOF && n + m){init();for(int i = 1; i <= m; ++ i){int x, y;scanf("%d%d", &x, &y);if(x == y)continue;hate[y][x] = hate[x][y] = 1;}for(int i = 1; i < n; ++ i)for(int j = i + 1; j <= n; ++ j){if(!hate[i][j])//不恨的连边add(i, j), add(j, i);}for(int i = 1; i <= n; ++ i){if(!dfn[i])tarjan(i, i);}for(int i = 1; i <= dcc_cnt; ++ i){now = i;//连通块编号for(int j = 0; j < dcc[i].size(); ++ j){vis[dcc[i][j]] = now, color[dcc[i][j]] = 0;}flag = false;if(dcc[i].size())dfs(dcc[i][0], 1);if(flag)//如果不是二分图说明有奇环说明可以参加会议for(int j = 0; j < dcc[i].size(); ++ j)able[dcc[i][j]] = 1;}int ans = 0;for(int i =1; i <= n; ++ i){if(!able[i])ans ++ ;}printf("%d\n", ans);}return 0;
}

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

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

    题目链接 题意 有N个骑士,每个骑士有自己不喜欢的人,你需要选择奇数个骑士开一个圆桌会议,每个骑士不能和自己不喜欢的人挨着坐. 问需要删除那些人,这些人不能组成圆桌会议 思路 按照补图建边求双连通分量 ...

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

    http://poj.org/problem?id=2942 题意: 有N个骑士,给出某些骑士之间的仇恨关系,骑士们开会时会围坐在一个圆桌旁.一次会议能够顺利举行,要满足两个条件: 1:任意相互憎恨的 ...

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

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

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

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

  5. poj2942 圆桌骑士(点双连通分量+二分图染色法判奇环)

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

  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. 如果圆桌骑士有特殊情况(Knights of the Round Table)

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

  8. poj 2942-圆桌骑士(点双连通分量+二分图)

    题目:http://poj.org/problem?id=2942 题意: 一群骑士,某些骑士之间互相憎恨,如果在一起容易发生争斗事件,因此他们只有满足一定条件才能参加圆桌会议:1.圆桌边上任意相邻的 ...

  9. 双离合档把上按钮作用_求双离合档位详细解释

    求双离合档位详细解释以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 双离合变速器是自动变速器的一种,主要档位有P.R.N ...

最新文章

  1. 机器学习中,有哪些特征选择的工程方法?
  2. FileInputStream 之read(byte [] b)方法
  3. [转] Putty - 文件夹显示的蓝色太暗
  4. 原生 js 上传图片
  5. HttpClient发送Get请求(java)【从新浪云搬运】
  6. user exits, customer exits, badi
  7. 项目质量管理:质量与质量管理概念
  8. maven里如何根据不同的environment打包
  9. Python 网页编程- Pyramid 安装测试
  10. 10kv线路负载率计算_电工必懂计算公式,你若不会,如何立足于电力行业?
  11. 关于bootstrap的modal弹出层嵌套子Modal所引发的血案(转)
  12. glance查看进程内存使用过大问题
  13. Cocos2d-x移植Android 常见问题处理办法
  14. hb100 微波雷达arduino_HB100微波雷达模块无线X波段雷达探测器探头传感器模块10.525GHz...
  15. 其他计算机找不到共享打印机驱动程序,win10连接共享打印机时“找不到驱动程序”怎么解决_win10连接共享打印机时“找不到驱动程序”处理方法...
  16. 松下服务器A5代码70维修,松下伺服电机A5系列故障代码.pdf
  17. SpringBoot 整合activiti5.22 实现一个完整的请假流程
  18. sql20005 分页存储过程
  19. 「自控原理」3.3 稳定性与稳态误差、时域校正
  20. 美团“互联网下半场”的筹码:豪赌B端业务

热门文章

  1. 使用Python+OpenCV+detectorn2实现社交距离检测
  2. 使用Python+OpenCV预测年龄与性别
  3. 机器人视觉的九大挑战
  4. 物体检测中的Objectness是什么?
  5. PIE SDK打开静止卫星数据
  6. 121. Best Time to Buy and Sell Stock
  7. G - IP地址转换
  8. 在 Azure 中的 Linux VM 上创建 MongoDB、Express、AngularJS 和 Node.js (MEAN) 堆栈
  9. 《编写高质量代码:改善c程序代码的125个建议》——建议3-5:避免使用浮点数作为循环计数器...
  10. 前端资源预加载并展示进度条