POJ 2438 (哈密顿回路)
分析:
2*n个小朋友,每个最多有n-1个"敌人",显然是存在哈密顿回路的.
预处理边,然后找哈密顿回路.
code
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;
#define pb push_back
#define sz(a) (int)(a).size() const int INF = 500;
bool edge[INF][INF];
typedef vector<int> vi;
vi ans;
//求哈密顿回路O(n^2)
void Hamilton (vi& ans, bool edge[INF][INF], int n) {
int s = 1, tol = 2, t, i, j;
bool vis[INF] = {0};
for (i = 1; i <= n; i++) if (edge[s][i]) break;
t = i;
vis[s] = vis[t] = 1;
ans.pb (s); ans.pb (t);
while (1) {
//头尾拓展
while (1) {
for (i = 1; i <= n; i++) {
if (edge[t][i] && !vis[i]) {
vis[i] = 1; t = i;
ans.pb (i);
break;
}
}
if (i > n) break;
}
reverse (ans.begin(), ans.end() );
swap (s, t);
while (1) {
for (i = 1; i <= n; i++) {
if (edge[t][i] && !vis[i]) {
vis[i] = 1; t = i;
ans.pb (i);
break;
}
}
if (i > n) break;
}
//如果S和T不相连
if (!edge[s][t]) {
for (i = 1; i < sz (ans) - 2; i++)
if (edge[ans[i]][t] && edge[ans[i + 1]][s]) break;
reverse (ans.begin() + i + 1, ans.end() );
t = * (ans.end() - 1);
}
tol = sz (ans);
if (tol == n) return;
//如果还有点未加入ans
for (j = 1; j <= n; j++) {
if (vis[j]) continue;
//找到与这个点相连的点
for (i = 1; i < tol - 1; i++) if (edge[ans[i]][j]) break;
if (edge[ans[i]][j]) break;
}
s = ans[i - 1], t = j;
reverse (ans.begin(), ans.begin() + i );
reverse (ans.begin() + i, ans.end() );
ans.pb (j), vis[j] = 1;
}
}
int n, m;
int main() {
while (~scanf ("%d %d", &n, &m) ) {
if (n == 0 && m == 0) return 0;
memset (edge, 1, sizeof edge);
for (int i = 1; i <= 2 * n; i++) edge[i][i] = 0;
int x, y;
for (int i = 1; i <= m; i++) {
scanf ("%d %d", &x, &y);
edge[y][x] = edge[x][y] = 0;
}
ans.clear();
Hamilton (ans, edge, n << 1);
printf ("%d", ans[0]);
for (int i = 1; i < sz (ans); i++)
printf (" %d", ans[i]);
putchar (10);
}
}
POJ 2438 (哈密顿回路)的更多相关文章
- POJ 2438 哈密顿回路
Children's Dining Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4730 Accepted: 754 ...
- POJ 2438 Children's Dining(哈密顿回路)
题目链接:http://poj.org/problem?id=2438 本文链接:http://www.cnblogs.com/Ash-ly/p/5452615.html 题意: 有2*N个小朋友要坐 ...
- poj 2438 Children's Dining
http://poj.org/problem?id=2438 题意: 有2*N个人要坐在一张圆桌上吃饭,有的人之间存在敌对关系,安排一个座位次序,使得敌对的人不相邻. 假设每个人最多有N-1个敌人.如 ...
- POJ 2438 Children’s Dining (哈密顿图模板题之巧妙建反图 )
题目链接 Description Usually children in kindergarten like to quarrel with each other. This situation an ...
- Hamilton回路的判定与构造
定理1:在一个具有n个顶点的无向连通图G中,如果任意两个顶点的度数之和大于n,则G具有Hamilton回路.此条件为充分条件 定理2:设图G = <V,E>,是Hamilton图,则对于v ...
- Ouroboros Snake POJ - 1392(数位哈密顿回路)
看hdu 2894的题意 两个题一样 旋转鼓的表面分成m块扇形,如图所示(m=8).图中阴影区表示用导电材料制成,空白区用绝缘材料制成,终端a.b和c是3(k=3)处接地或不是接地分别用二进制信号0 ...
- POJ 3301 Texas Trip (三分)
题目链接 题意 : 给你若干个点,让你找最小的正方形覆盖这所有的点.输出面积. 思路 : 三分枚举正方形两对边的距离,然后求出最大,本题用的是旋转正方形,也可以用旋转点,即点的相对位置不变. 正方形从 ...
- 【转】欧拉回路&特殊图下的哈密顿回路题集
转自:http://blog.csdn.net/shahdza/article/details/7779385 欧拉回路[HDU]1878 欧拉回路 判断3018 Ant Trip 一笔画问题1116 ...
- 【POJ】【1739】Tony's Tour
插头DP 楼教主男人八题之一! 要求从左下角走到右下角的哈密顿路径数量. 啊嘞,我只会求哈密顿回路啊……这可怎么搞…… 容易想到:要是把起点和重点直接连上就变成一条回路了……那么我们就连一下~ 我们可 ...
随机推荐
- Java Integer类分析
public static final int MIN_VALUE = 0x80000000; -2^31 public static final int MAX_VALUE = 0x7ff ...
- ZOJ-2112-Dynamic Rankings(线段树套splay树)
题意: 完成两个操作: 1.询问一个区间里第k小的数: 2.修改数列中一个数的值. 分析: 线段树套平衡树,线段树中的每个节点都有一棵平衡树,维护线段树所记录的这个区间的元素.这样处理空间上是O(nl ...
- (转载)php flush()刷新不能输出缓冲的原因分析
(转载)http://www.webkaka.com/tutorial/php/2012/110628/ 在php程序编写中,flush()的使用率还是挺高的,它在网页表现即时信息效果时发挥了极为重要 ...
- Introduction to Glide, Image Loader Library for Android, recommended by Google
In the passed Google Developer Summit Thailand, Google introduced us an Image Loader Library for And ...
- Linux 守护进程的启动方法
守护进程”(daemon)就是一直在后台运行的进程(daemon). 本文介绍如何将一个 Web 应用,启动为守护进程. 一.问题的由来 Web应用写好后,下一件事就是启动,让它一直在后台运行. 这并 ...
- 《Qt编程的艺术》——8.2.1 在Designer中使用View类
不幸的是,QDirModel有一个严重的限制:因为view不响应鼠标操作,我们不得不自己建立这些功能.除此之外,每个view中,用户都一次只能选择一个元素.如果你想要允许同时选择多个项目,你也必须自己 ...
- dependencyManagement与dependencies区别
最近在阅读maven项目代码时,dependencyManagement与dependencies之间的区别不是很了解,现通过项目实例进行总结:项目epps-demob-pom下有一个模块是epps- ...
- Monkey log分析说明
运行命令: adb shell monkey -p com.crazyhornets.MyHokageAndroidZSY -v -v -v 20 -- throttle 1000 Log: :Mon ...
- 双系统如何正确的使用修复BCD工具分享
安装双系统时候,用于种种原因会导致开机启动只显示一个系统,此时需要修复下BCD即可. 下面介绍下两个修复BCD工具软件: 1.easybcd(双系统引导修复工具) v2.2.0.182 汉化版 下载地 ...
- What is therelationship between @EJB and ejb-ref/ejb-local-ref?
http://glassfish.java.net/javaee5/ejb/EJB_FAQ.html What is therelationship between @EJB and ejb-ref/ ...