SGU 122.The book (哈密顿回路)
题目描述
有一群人从1到N标号,而且这群人中每个人的朋友个数不少于 (N+1)/2 个。
编号为1的人有一本其他人都想阅读的书。
写一个程序,找到一种传阅顺序使得书本只经过每个人手中一次,并且一个人只能将书本传给他的朋友,并且书本最后必须传回给第一个人。(注释:如果A是B的朋友,那么B一定是A的朋友)
输入
第一行包含一个数字N。
接下来的有N行,第i行表示第i-1个人的朋友
输出
如果不存在解决方案,则输出 'No solution' 。否则你将输出1行包含N+1个整数,表示传阅路径,由1开始、由1结尾。
输入样例
4
2 3
1 4
1 4
2 3
输出样例
1 3 4 2 1
Solution:
每个人至少有(n+1)/2 个朋友,一定存在哈密顿回路.
找到哈密顿路后,从1 的位置开始输出,最后再输出一个1.
code:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#define INF 1111
using namespace std;
bool edge[INF][INF];
int ans[INF], vis[INF];
int n, tol = 2, t, s = 1;
void expand() {
int i;
while (1) {
for (i = 1; i <= n; i++) {
if (edge[t][i] && !vis[i]) {
ans[tol++] = i;
t = i, vis[i] = 1;
break;
}
}
if (i > n) return;
}
}
void Hamiton() {
int i, j;
for (i = 1; i <= n; i++) if (edge[s][i]) break;
t = i;
ans[0] = s, ans[1] = t;
vis[s] = vis[t] = 1;
while (1) {
expand();
reverse (ans, ans + tol);
swap (s, t);
expand();
if (!edge[s][t]) {
for (i = 1; i < tol - 2; i++)
if (edge[ans[i]][t] && edge[ans[i + 1]][s]) break;
reverse (ans + i + 1, ans + tol);
t = ans[tol - 1];
}
if (tol == n) return;
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, ans + i);
reverse (ans + i, ans + tol);
ans[tol++] = j, vis[j] = 1;
}
}
int main() {
char ci;
scanf ("%d", &n);
for (int i = 1; i <= n; i++) {
scanf ("%d", &t);
edge[i][t] = edge[t][i] = 1;
ci = getchar();
while (ci != '\n' && ci != '\r' && ci != EOF)
scanf ("%d", &t), edge[i][t] = edge[t][i] = 1, ci = getchar();
}
Hamiton();
int i;
for (i = 0; i < n; i++)
if (ans[i] == 1) break;
for (int j = 0; j < n; j++) {
printf ("%d ", ans[i]);
i++;
if (i == n) i = 0;
}
putchar ('0' + 1);
return 0;
}
SGU 122.The book (哈密顿回路)的更多相关文章
- sgu 122. The book 满足ore性质的汉密尔顿回路 难度:2
122. The book time limit per test: 0.25 sec. memory limit per test: 4096 KB There is a group of N (2 ...
- The sum - SGU 122(斐波那契前N项和)
直接上代码....... ======================================================================================= ...
- 今日SGU 5.27
SGU 122 题意:给你n个人,每个人有大于 N / 2(向上取整)的朋友,问你1这个人有一个书,每个人都想看,只能从朋友之间传递,然后最后回到了1这个人,问你 是否有解,然后有解输出路径 收获:哈 ...
- SGU 分类
http://acm.sgu.ru/problemset.php?contest=0&volume=1 101 Domino 欧拉路 102 Coprime 枚举/数学方法 103 Traff ...
- SGU Volume 1
SGU 解题报告(持续更新中...Ctrl+A可看题目类型): SGU101.Domino(多米诺骨牌)------------★★★type:图 SGU102.Coprimes(互质的数) SGU1 ...
- SGU 156. Strange Graph(欧拉路)
时间限制:0.25s 空间限制:6M 题目描述 让我们想象一个无向图G=<V,E>.如果边(u,v)在边集E中,那么我们就说两个顶点u和v是邻接点.在这种情况下,我们也说u是v的一个邻接点 ...
- 122. Best Time to Buy and Sell Stock(二) leetcode解题笔记
122. Best Time to Buy and Sell Stock II Say you have an array for which the ith element is the price ...
- SGU 495. Kids and Prizes
水概率....SGU里难得的水题.... 495. Kids and Prizes Time limit per test: 0.5 second(s)Memory limit: 262144 kil ...
- HDU 1693 Eat the Trees(插头DP、棋盘哈密顿回路数)+ URAL 1519 Formula 1(插头DP、棋盘哈密顿单回路数)
插头DP基础题的样子...输入N,M<=11,以及N*M的01矩阵,0(1)表示有(无)障碍物.输出哈密顿回路(可以多回路)方案数... 看了个ppt,画了下图...感觉还是挺有效的... 参考 ...
随机推荐
- Maven学习(1) - Maven入门
home index:http://maven.apache.org/ download:http://maven.apache.org/download.cgi install: http://ma ...
- Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍
磁盘分区表.文件系统的查看.统计的工具很多,有些工具是多功能的,不仅仅是查看磁盘的分区表,而且也能进行磁盘分区的操作:但在本文,我们只讲磁盘分区的查看,以及分区的使用情况的查看:本文只是给新手上路之用 ...
- POI做题记录:第二届POI
Trees Memory limit: 32 MB Trees occur very often in computer science. As opposed to trees in nature, ...
- Android 国内镜像
Android SDK官网国内很难直接访问,除了FQ/VPN等方法还是很不方便. 原有的Android SDK直接下载因http://dl-ssl.google.com/android/reposit ...
- 在QTP中使用DOM
大家对DOM应该都不陌生,它在网页制作中有广泛的应用.如果我们想在QTP中使用DOM模型需要通过Page对象的Object属性来实现.注意,QTP11才有良好的DOM支持操作,这里用百度首页做例子. ...
- RC滤波器
1.一阶RC低通滤波器 RC低通滤波器的电路及其幅频.相频特性如下图所示,输入电压为ex,输出电压为ey 其中ζ=RC,截止频率f=1/2πRC. 2.一阶RC高通滤波器 其中ζ=RC,截止频率f=1 ...
- Matlab中常用操作
(1)换行操作: 末尾加上“...”,然后加enter:有时候多条语句重起一行,这时shift+enter >> 4*sin(0.3)*...8 (2)一些快捷键: Ctrl+R 可多行同 ...
- 计算机视觉code与软件
Research Code A rational methodology for lossy compression - REWIC is a software-based implementatio ...
- netcat运行出错
今天项目上利用运行netca创建监听时报错,(运行netmgr可以弹出窗口,未测试是否可以建立监听) 报错信息: [oracle@BSS-WG2 ~]$netca Oracle Net Service ...
- stand meeting
“每日站立会议”.每日站立会议有一些具体的指导原则: 会议准时开始. (没有特殊情况10点开始) 欢迎所有人参加,但只允许有实际工作的团队成员发言. 不论团队规模大小,会议被限制在15分钟.(每个人2 ...