122. The book

time limit per test: 0.25 sec. 
memory limit per test: 4096 KB

There is a group of N (2<=N<=1000) people which are numbered 1 through N, and everyone of them has not less than [ (N+1) / 2 ] friends. A man with number 1 has the book, which others want to read. Write the program which finds a way of transferring the book so that it will visit every man only once, passing from the friend to the friend, and, at last, has come back to the owner. Note: if A is a friend of B then B is a friend of A.

Input

First line of input contains number N. Next N lines contain information about friendships. (i+1)-th line of input contains a list of friends of i-th man.

Output

If there is no solution then your program must output 'No solution'.   Else your program must output exactly N+1 number: this sequence should begin and should come to end by number 1, any two neighbours in it should be friends, and any two elements in it, except for the first and last, should not repeat.

Sample Input

4
2 3
1 4
1 4
2 3

Sample Output

1 3 4 2 1

1.找到一条不能延伸的路径,此时设左边为st,右边为ed,那么一定满足的性质是,st和ed所能到达的所有点都在这条路上,又由于这个图的性质,两点度数加和一定大于n+1,
根据鸽巢原理,总能找到一个点j,使得j连接ed,nxt[j]连接st,这时候删除j->nxt[j],得到一个环
2.找到一个在环外的点,拆环并且延伸路径
重复这两步直到形成长度为n的环
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=1001;
int n;
bool vis[maxn],use[maxn];
int G[maxn][maxn],len[maxn],pre[maxn],nxt[maxn],st,ed;
int predfs(int cnt){
vis[st]=true;
for(int i=0;i<len[st];i++){
int to=G[st][i];
if(!vis[to]){pre[st]=to;nxt[to]=st;st=to;return predfs(cnt+1);}
}
return cnt;
}
int nxtdfs(int cnt){
vis[ed]=true;
for(int i=0;i<len[ed];i++){
int to=G[ed][i];
if(!vis[to]){nxt[ed]=to;pre[to]=ed;ed=to;return nxtdfs(cnt+1);}
}
return cnt;
}
bool getloop(){
if(st==ed)return true;
for(int i=0;i<len[ed];i++){
int to=G[ed][i];
if(to==st){pre[st]=ed;nxt[ed]=st;return true;}
for(int j=0;j<len[nxt[to]];j++){
int jto=G[nxt[to]][j];
int tt=nxt[to];
if(jto==st){
int tmp;
while(st!=ed){
nxt[ed]=to;
tmp=pre[to];
pre[to]=ed;
ed=to;
to=tmp;
}
nxt[st]=tt;
pre[tt]=st;
return true;
}
}
}
return false;
}
bool breakloop(){
for(int i=1;i<=n;i++){
if(!vis[i]){
for(int j=0;j<len[i];j++){
if(vis[G[i][j]]){
st=i;
ed=pre[G[i][j]];
nxt[i]=G[i][j];
pre[G[i][j]]=st;
return true;
}
}
}
}
return false;
}
void printloop(){
int sst=1,tmp=1;
bool fl=false;
while(sst!=tmp||!fl){
printf("%d ",tmp);
if(nxt[tmp]==tmp)break;
tmp=nxt[tmp];
fl=true;
}
puts("1");
}
void addedge(int f,int t){
G[f][len[f]++]=t;
}
int main(){
scanf("%d",&n);
getchar();
for(int i=1;i<=n;i++){
int tmpt;
while(scanf("%d",&tmpt)==1){
if(tmpt!=i)addedge(i,tmpt);
if(i==1)use[tmpt]=true;
char ch=getchar();
if(ch=='\n')break;
}
}
int len=1;
st=ed=1;
while(len<n){
len+=predfs(0);
len+=nxtdfs(0);
if(len==n)break;
if(!getloop())break;
if(!breakloop())break;
len++;
}
getloop();
if(len<n)puts("No solution");
printloop();
return 0;
}

  

sgu 122. The book 满足ore性质的汉密尔顿回路 难度:2的更多相关文章

  1. SGU 156 Strange Graph 欧拉回路,思路,汉密尔顿回路 难度:3

    http://acm.sgu.ru/problem.php?contest=0&problem=156 这道题有两种点 1. 度数>2 在团中的点,一定连接一个度数为2的点 2. 度数等 ...

  2. The sum - SGU 122(斐波那契前N项和)

    直接上代码....... ======================================================================================= ...

  3. SGU 122.The book (哈密顿回路)

    题目描述 有一群人从1到N标号,而且这群人中每个人的朋友个数不少于 (N+1)/2 个. 编号为1的人有一本其他人都想阅读的书. 写一个程序,找到一种传阅顺序使得书本只经过每个人手中一次,并且一个人只 ...

  4. 今日SGU 5.27

    SGU 122 题意:给你n个人,每个人有大于 N / 2(向上取整)的朋友,问你1这个人有一个书,每个人都想看,只能从朋友之间传递,然后最后回到了1这个人,问你 是否有解,然后有解输出路径 收获:哈 ...

  5. javascript输出图的简单路径

    <script> //图的构建 function vnode() { this.visited=0; this.vertex=0; this.arcs=new Array(); } fun ...

  6. P、NP、NPC、NPH问题的区别和联系

    时间复杂度 时间复杂度描述了当输入规模变大时,程序运行时间的变化程度,通常使用\(O\)来表示.比如单层循环的时间复杂度为\(O(n)\),也就是说程序运行的时间随着输入规模的增大线性增长,两层循环的 ...

  7. Pow共识算法

    谈到哈希算法,每个程序员都不陌生,但是谈到比特币共识算法PoW,如果没有接触过的技术人员可能觉得应该会很复杂,毕竟全球的比特币节点数量如此庞大,达成共识的算法应该不会很简单.但其实如果你已掌握哈希算法 ...

  8. 初赛Part2

    初赛 时间复杂度 主定理(必考) \[ T(n) = aT(\frac{n}{b})+f(n) \] 其中,\(n\)为问题的规模,\(a\)为递推下子问题的数量,\(\frac{n}{b}\)为每个 ...

  9. SGU 101.Domino (欧拉路)

    时间限制: 0.5 sec 空间限制: 4096 KB 描述 多米诺骨牌,一种用小的方的木块或其他材料,每个都被一些点在面上标记,这些木块通常被称为骨牌.每个骨牌的面都被一条线分成两个   方形,两边 ...

随机推荐

  1. 关于Session的概念和测试点

    Session概要 Session 是用于保持状态的基于 Web 服务器的方法,在 Web 服务器上保持用户的状态信息供在任何时间从任何页访问. Session 允许通过将对象存储在 Web 服务器的 ...

  2. Django框架(二) MTV模型简介

    MTV模型 Django的MTV分别代表 Model(模型):和数据库相关的,负责业务对象与数据库的对象(ORM) Template(模板):放所有的html文件 模板语法:目的是将白变量(数据库的内 ...

  3. HDU 1796 How many integers can you find(容斥)题解

    思路:二进制解决容斥问题,就和昨天做的差不多.但是这里题目给的因子不是质因子,所以我们求多个因子相乘时要算最小公倍数.题目所给的因数为非负数,故可能有0,如果因子为0就要删除. 代码: #includ ...

  4. 分析redis key大小的几种方法

    当redis被用作缓存时,有时我们希望了解key的大小分布,或者想知道哪些key占的空间比较大.本文提供了几种方法. 一. bigKeys 这是redis-cli自带的一个命令.对整个redis进行扫 ...

  5. 【配置、开发】Spark入门教程[2]

    本教程源于2016年3月出版书籍<Spark原理.机制及应用> ,在此以知识共享为初衷公开部分内容,如有兴趣,请支持正版书籍. Spark为使用者提供了大量的工具和脚本文件,使得其部署与开 ...

  6. 【eclipse】聚合工程maven启动Tomcat报错

    严重: Error configuring application listener of class严重: Skipped installing application listeners due ...

  7. Uncaught TypeError: $(...).daterangepicker is not a function

    本文为博主原创,未经允许不得转载: 在用bootstrap做一个日期插件的时候,代码和js,css等都是拷贝网上下载下来的实例,但是在 调试的时候,浏览器控制台一直报错 Uncaught TypeEr ...

  8. 【TCP/IP详解 卷一:协议】第二十四章 TCP的未来与性能

    来到了TCP的最后一个章节,未来与性能.在当时(1991年)的未来,如今已经部分变为现实,部分就只是历史中的实验. 主要内容: 路径MTU的发现与TCP的结合. 长肥管道 和 高速千兆比网络. 窗口扩 ...

  9. 【Coursera】Technology :Fifth Week(2)

    The Ethernet Story Bob Metcalfe Bob 参与了 Xerox 研究项目,着手解决建造一个处处连接个人计算机的架构.当时,他们刚刚完成了 Internet 的开端 -具有 ...

  10. Ubuntu14.04 libboost_program_options.so.1.54.0: cannot open shared object file: No such file or directory

    macname@ubuntu:~/Desktop$ roslaunch blackrospack: error : cannot open shared object file: No such fi ...