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 楼教主男人八题之一! 要求从左下角走到右下角的哈密顿路径数量. 啊嘞,我只会求哈密顿回路啊……这可怎么搞…… 容易想到:要是把起点和重点直接连上就变成一条回路了……那么我们就连一下~ 我们可 ...
随机推荐
- 一键安装mysql5.6
#!/bin/bash # @Name:install_mysql.sh # @Author:Eivllom # @Create -- # @Modify -- app_soft="/app ...
- 【转】java提高篇(二三)-----HashMap
原文网址: http://www.cnblogs.com/chenssy/p/3521565.html HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以 ...
- HDOJ(HDU) 2113 Secret Number(遍历数字位数的每个数字)
Problem Description 有一天, KIKI 收到一张奇怪的信, 信上要KIKI 计算出给定数各个位上数字为偶数的和. eg. 5548 结果为12 , 等于 4 + 8 KIKI 很苦 ...
- 浅谈JavaScript函数
JavaScript作为一种基于对象(非严格面向对象)的语言,函数在JS中的地位非同一般:用函数声明类和对象.甚至函数本身也是对象. 一.函数的三种声明方式辨析. 1.function命令 funct ...
- “VICUTU威克多”高档男装
"VICUTU威克多"高档男装 北京威克多制衣中心是一家从事高档男装设计.制造和销售为一体的股份服装企业.主要经营品牌为"VICUTU"男装系列,主导产品为 ...
- hdoj 2102 A计划
A计划 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- multipath.conf
# This is a basic configuration file with some examples, for device mapper# multipath.# For a comple ...
- RabbitMQ-优先级(priority)队列/消息
就像在日常生活中,事情有轻重缓急一样.我们对于需要处理的消息也有这样的需求. 例如重要的消息我要尽快的得到处理,当然我们可以给重要的消息开个“VIP通道”,但是VIP数量很多,并且VIP也分层次呢? ...
- javaweb笔记5之请求编码问题
post提交: 设置实体内容的编码:request.setCharacterEncoding("utf-8"); 注意:一定要在获取所有参数之前设置,否则设置无效! get方式提交 ...
- Quartz的cronTrigger表达式
CronTrigger CronTriggers往往比SimpleTrigger更有用,如果您需要基于日历的概念,而非SimpleTrigger完全指定的时间间隔,复发的发射工作的时间表.CronTr ...