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,画了下图...感觉还是挺有效的... 参考 ...
随机推荐
- php 中 global 与 $GLOBAL 由引用产生的区别
很多人都认为global和$GLOBALS[]只是写法上面的差别,其实不然. 根据官方的解释是 $GLOBALS['var'] 是外部的全局变量$var本身. global $var 是外部$var的 ...
- margin设置为负数
1.为负margin“平反” 我们在CSS中都会使用margin,但将margin设置成负数,那可能就不大好处理了.在网页设计中,人们对负margin用法的态度大相径庭,有的人非常喜欢,而有的人则认为 ...
- Linux process state codes
Here are the different values that the s, stat and state output specifiers (header "STAT" ...
- hdu 4738 Caocao's Bridges (tarjan求桥)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 题目大意:给一些点,用一些边把这些点相连,每一条边上有一个权值.现在要你破坏任意一个边(要付出相 ...
- jquery 使用方式记录
1.监听键盘事件 $("#id").keyup(function(event){ if(event.keyCode == 13){ $("#btn_addgoods_su ...
- hdoj 1969 Pie【二分】
Pie Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- Swift基本语法学习笔记
Swift与OC的不同点 导入框架的方式 OC使用#import \<UIKit/UIKit.h> Swift使用import UIKit 定义标识符的方式 Swift中定义标识符,必须指 ...
- php优化技巧
PHP优化的目的是花最少的代价换来最快的运行速度与最容易维护的代码.本文给大家提供全面的优化技巧. 1.echo比print快. 2.使用echo的多重参数代替字符串连接. 3.在执行for循环之前确 ...
- UVA - 10785 The Mad Numerologist
题目链接 这个题又犯了省题不清的错误.导致不停 wa.唉. 题目意思是给你一个长度L,然后和一张表相应每一个大写字母的value值.你须要依照一定规则找出长度为L的序列. 注意 序列的value值要 ...
- HTML5游戏开发技术基础整理
随着HTML5标准终于敲定.HTML5将有望成为游戏开发领域的的热门平台. HTML5游戏能够执行于包含iPhone系列和iPad系列在内的计算机.智能手机以及平板电脑上,是眼下跨平台应用开发的最佳实 ...