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 楼教主男人八题之一! 要求从左下角走到右下角的哈密顿路径数量. 啊嘞,我只会求哈密顿回路啊……这可怎么搞…… 容易想到:要是把起点和重点直接连上就变成一条回路了……那么我们就连一下~ 我们可 ...
随机推荐
- Unity 用C#脚本读取JSON文件数据
读取JSON文件数据网上有很多方法吗,这里采用SimpleJSON,关于SimpleJSON的介绍参考以下链接:http://wiki.unity3d.com/index.php/SimpleJSON ...
- JFS与JFS2的区别
请问一下JFS与JFS2的区别? 支持最大的文件? 普通JFS:2G:支持大文件JFS:64G:JFS2:1T 支持最大的文件系统?普通JFS,支持大文件JFS,JFS2分别是多大呢? The max ...
- Kernel-Scheduler implementation
2033 const struct sched_class rt_sched_class = { 2034 .next = &fair_sched_class, 2035 .enqueue_t ...
- Poetize4 创世纪
3037: 创世纪 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 123 Solved: 66[Submit][Status] Description ...
- 线段树(维护最大值):HDU Billboard
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 【动态规划】Vijos P1680 距离
题目链接: https://vijos.org/p/1680 题目大意: 设有字符串X,我们称在X的头尾及中间插入任意多个空格后构成的新字符串为X的扩展串,如字符串X为”abcbcd”,则字符串“ab ...
- HDU4003 Find Metal Mineral
看别人思路的 树形分组背包. 题意:给出结点数n,起点s,机器人数k,然后n-1行给出相互连接的两个点,还有这条路线的价值,要求最小花费 思路:这是我从别人博客里找到的解释,因为很详细就引用了 dp[ ...
- openSession和getCurrentSession的比较
在比较openSession和getCurrentSession这两个方法之前,我们先认识一下这两个方法. 在进行配置信息管理时,我们一般进行一下简单步骤: Configuration cfg = n ...
- 外星人的供给站 (区间覆盖 t贪心)
/** 区间覆盖问题 分析: 每个点可以确定两个圆心 圆心的范围形成 一个区间 在这个区间上以任意一点画圆便可将此点 包含在内 如果有两个点所确定的区间相交了 说明这两个点可以用一个圆包含在内 即用一 ...
- Real-Rime Rendering (2) - 变换和矩阵(Translation and Matrics)
提要 在图形的计算中,比如旋转.缩放.平移.投影等操作,矩阵都扮演着极其重要的角色,它是操作图元的基本工具.虽然很多的图形API已经封装好了这些矩阵操作,但是理解这些矩阵操作的原理会非常非常有帮助,比 ...