欧拉路径

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

在上一回中小Hi和小Ho控制着主角收集了分散在各个木桥上的道具,这些道具其实是一块一块骨牌。

Hiho : 欧拉路径-LMLPHP

主角继续往前走,面前出现了一座石桥,石桥的尽头有一道火焰墙,似乎无法通过。

小Hi注意到在桥头有一张小纸片,于是控制主角捡起了这张纸片,只见上面写着:

将M块骨牌首尾相连放置于石桥的凹糟中,即可关闭火焰墙。切记骨牌需要数字相同才能连接。
——By 无名的冒险者

小Hi和小Ho打开了主角的道具栏,发现主角恰好拥有M快骨牌。

小Ho:也就是说要把所有骨牌都放在凹槽中才能关闭火焰墙,数字相同是什么意思?

小Hi:你看,每一块骨牌两端各有一个数字,大概是只有当数字相同时才可以相连放置,比如:

Hiho : 欧拉路径-LMLPHP

小Ho:原来如此,那么我们先看看能不能把所有的骨牌连接起来吧。

提示:Fleury算法求欧拉路径

输入

第1行:2个正整数,N,M。分别表示骨牌上出现的最大数字和骨牌数量。1≤N≤1,000,1≤M≤5,000

第2..M+1行:每行2个整数,u,v。第i+1行表示第i块骨牌两端的数字(u,v),1≤u,v≤N

输出

第1行:m+1个数字,表示骨牌首尾相连后的数字

比如骨牌连接的状态为(1,5)(5,3)(3,2)(2,4)(4,3),则输出"1 5 3 2 4 3"

你可以输出任意一组合法的解。

样例输入
5 5
3 5
3 2
4 2
3 4
5 1
样例输出
1 5 3 4 2 3
 import java.util.ArrayList;
import java.util.Scanner; public class Main { ArrayList result = new ArrayList();
public static void main(String[] argv){ Scanner in = new Scanner(System.in);
int m = in.nextInt();
int n = in.nextInt();
/*
* 用可变长数组来代替链表 描述无向图
*/
ArrayList<Integer>[] s = new ArrayList[m];
for(int i=0; i<m; i++){
s[i] = new ArrayList<Integer>();
}
for(int j=0; j<n; j++){
int a = in.nextInt();
int b = in.nextInt();
s[a-1].add(b-1);
s[b-1].add(a-1);
}
in.close();
//System.out.println("Begin check");
Main Test = new Main(); /*
* 查看是否符合 度数为奇数的点有2个或0个
*/
int begin_State = Test.firstSuccess(s);
if(begin_State==s.length){
System.out.println("Part");
return;
}
else{ Test.DNF(s, begin_State);
for(int i=0;i<Test.result.size(); i++){
if(i>0)
System.out.print(" ");
System.out.print(Test.result.get(i));
}
//System.out.println(begin_State);
/*
* 查看是否为连通图
*/
/*
boolean second = Test.secondSuccess(s, begin_State);
if(second)
System.out.println("Full");
else
System.out.println("Part");
*/
} } public int firstSuccess(ArrayList[] s){
int success = 0;
int leng =s.length;
int Max_simple=0;
for(int i=0; i<leng; i++){
//System.out.println(s[i].toString());
int temp = s[i].size();
//System.out.print(temp);
if(temp%2==1){
success++;
Max_simple=i;
//System.out.println(i);
}
if(success>2)
break;
}
//System.out.println(success);
if(success==2||success==0)
return Max_simple;
else
return leng;
} public boolean secondSuccess(ArrayList[] s, int begin){
int length = s.length;
int [] Add = new int[length];
int [] Checked = new int[length];
Add[begin]=1;
int Number=0;
while(true){
int temp=0; int not_End=0;
for(int i=0; i<length; i++){
if(Add[i]==1&&Checked[i]==0){
temp=i;
not_End++;
break;
}
}
if(not_End==0)
break;
//System.out.println(temp);
for(int k=0; k<s[temp].size();k++){
Add[(int) s[temp].get(k)]=1;
}
Checked[temp]=1; Number++;
}
//System.out.println(Number);
if(Number==length)
return true;
else
return false;
} public void DNF(ArrayList[] s, int start){ while(true){ if(s[start].size()>0){
int temp = (Integer)s[start].get(0);
s[start].remove(0);
s[temp].remove((Integer)start);
DNF(s, temp);
}
else
break;
}
result.add(start+1);
//System.out.print(start); }
}
05-16 06:26