分析:

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 (哈密顿回路)的更多相关文章

  1. POJ 2438 哈密顿回路

    Children's Dining Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4730   Accepted: 754 ...

  2. POJ 2438 Children's Dining(哈密顿回路)

    题目链接:http://poj.org/problem?id=2438 本文链接:http://www.cnblogs.com/Ash-ly/p/5452615.html 题意: 有2*N个小朋友要坐 ...

  3. poj 2438 Children's Dining

    http://poj.org/problem?id=2438 题意: 有2*N个人要坐在一张圆桌上吃饭,有的人之间存在敌对关系,安排一个座位次序,使得敌对的人不相邻. 假设每个人最多有N-1个敌人.如 ...

  4. POJ 2438 Children’s Dining (哈密顿图模板题之巧妙建反图 )

    题目链接 Description Usually children in kindergarten like to quarrel with each other. This situation an ...

  5. Hamilton回路的判定与构造

    定理1:在一个具有n个顶点的无向连通图G中,如果任意两个顶点的度数之和大于n,则G具有Hamilton回路.此条件为充分条件 定理2:设图G = <V,E>,是Hamilton图,则对于v ...

  6. Ouroboros Snake POJ - 1392(数位哈密顿回路)

    看hdu 2894的题意  两个题一样 旋转鼓的表面分成m块扇形,如图所示(m=8).图中阴影区表示用导电材料制成,空白区用绝缘材料制成,终端a.b和c是3(k=3)处接地或不是接地分别用二进制信号0 ...

  7. POJ 3301 Texas Trip (三分)

    题目链接 题意 : 给你若干个点,让你找最小的正方形覆盖这所有的点.输出面积. 思路 : 三分枚举正方形两对边的距离,然后求出最大,本题用的是旋转正方形,也可以用旋转点,即点的相对位置不变. 正方形从 ...

  8. 【转】欧拉回路&特殊图下的哈密顿回路题集

    转自:http://blog.csdn.net/shahdza/article/details/7779385 欧拉回路[HDU]1878 欧拉回路 判断3018 Ant Trip 一笔画问题1116 ...

  9. 【POJ】【1739】Tony's Tour

    插头DP 楼教主男人八题之一! 要求从左下角走到右下角的哈密顿路径数量. 啊嘞,我只会求哈密顿回路啊……这可怎么搞…… 容易想到:要是把起点和重点直接连上就变成一条回路了……那么我们就连一下~ 我们可 ...

随机推荐

  1. ♫【异步】短小强悍的JavaScript异步调用库

    短小强悍的JavaScript异步调用库 var queue = function(funcs, scope) { (function next() { if(funcs.length > 0) ...

  2. iconv gbk字符转utf8字符

    直接上代码 bool gbk2utf8(const char* src, char* dest, size_t inlen) { const char *inbuf = src; size_t out ...

  3. HDOJ 2055 An easy problem

    Problem Description we define f(A) = 1, f(a) = -1, f(B) = 2, f(b) = -2, - f(Z) = 26, f(z) = -26; Giv ...

  4. CodeForces 689C  Mike and Chocolate Thieves

    题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=412145 题目大意:给定一个数字n,问能不能求得一个最小的整 ...

  5. JavaScript笔记(一),

    加法函数 javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显 //调用:accAdd(arg1,arg2) //返回值:arg1加上arg2的精确结果 function accA ...

  6. 全情投入是做好工作的基础——Leo鉴书39

    很多人都有:“内向的人则不擅长社交,只能会活得很封闭”的思想,于是不少内向的朋友要么认为只有扭曲自己的性格变得外向才能在社会上吃得开,才能很爽的行走职场:要么就决定完全封闭自己活在孤独之中,其实以上两 ...

  7. 七牛云- Java 端 使用

    项目 中需要把 图片放到 图片服务器上托管, 所以使用了七牛, 注册之后每个月 有免费100 万 次get请求,先说说怎么使用: 1 .注册, 获取自己的AK,SK

  8. HDOJ 5073 Galaxy 数学 贪心

    贪心: 保存连续的n-k个数,求最小的一段方差... .预处理O1算期望. .. Galaxy Time Limit: 2000/1000 MS (Java/Others)    Memory Lim ...

  9. Android中关于Task的一些认识

    Android中Task是一个逻辑上的概念,简单地说,就是一个栈里面顺序存储着的多个Activity.这些Activity能够是来自同一个App,也能够是来自不同的Apps. Task的创建 比方之前 ...

  10. [ES6] Array.findIndex()

    In es5, you can use indexOf to get the index of one item in an array. In es6, you can use findIndex( ...