Hiho : 欧拉路径

欧拉路径

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

描述

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

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

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

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

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

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

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

小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

  1 import java.util.ArrayList;
  2 import java.util.Scanner;
  3 
  4 
  5 public class Main {
  6 
  7        ArrayList result = new ArrayList();
  8         public static void main(String[] argv){
  9             
 10             Scanner in = new Scanner(System.in);
 11             int m = in.nextInt();
 12             int n = in.nextInt();
 13             /*
 14              * 用可变长数组来代替链表 描述无向图
 15              */
 16             ArrayList<Integer>[] s = new ArrayList[m];
 17             for(int i=0; i<m; i++){
 18                 s[i] = new ArrayList<Integer>();
 19             }
 20             for(int j=0; j<n; j++){
 21                 int a = in.nextInt();
 22                 int b = in.nextInt();
 23                 s[a-1].add(b-1);
 24                 s[b-1].add(a-1);
 25             }
 26             in.close();
 27             //System.out.println("Begin check");    
 28             Main Test = new Main();
 29             
 30             /*
 31              * 查看是否符合 度数为奇数的点有2个或0个
 32              */
 33             int begin_State = Test.firstSuccess(s);
 34             if(begin_State==s.length){                
 35                 System.out.println("Part");
 36                 return;
 37             }
 38             else{
 39                 
 40                 Test.DNF(s, begin_State);
 41                 for(int i=0;i<Test.result.size(); i++){
 42                     if(i>0)
 43                         System.out.print(" ");
 44                     System.out.print(Test.result.get(i));
 45                 }
 46                 //System.out.println(begin_State);
 47                 /*
 48                  * 查看是否为连通图
 49                  */
 50                 /*
 51                 boolean second =  Test.secondSuccess(s, begin_State);
 52                 if(second)
 53                     System.out.println("Full");
 54                 else
 55                     System.out.println("Part");
 56                 */
 57             }
 58             
 59             
 60             
 61         }
 62         
 63         public int firstSuccess(ArrayList[] s){
 64             int success = 0;
 65             int leng =s.length;
 66             int Max_simple=0;
 67             for(int i=0; i<leng; i++){
 68                 //System.out.println(s[i].toString());
 69                 int temp = s[i].size();
 70                 //System.out.print(temp);
 71                 if(temp%2==1){
 72                     success++;
 73                     Max_simple=i;
 74                     //System.out.println(i);
 75                 }                    
 76                 if(success>2)
 77                     break;
 78             }
 79             //System.out.println(success);
 80             if(success==2||success==0)
 81                 return Max_simple;
 82             else
 83                 return leng;
 84         }
 85         
 86         public boolean secondSuccess(ArrayList[] s, int begin){
 87             int length = s.length;
 88             int [] Add = new int[length];
 89             int [] Checked = new int[length];
 90             Add[begin]=1;
 91             int Number=0;
 92             while(true){
 93                 int temp=0; int not_End=0;
 94                 for(int i=0; i<length; i++){
 95                     if(Add[i]==1&&Checked[i]==0){
 96                         temp=i;
 97                         not_End++;
 98                         break;
 99                     }
100                 }                
101                 if(not_End==0)
102                     break;
103                 //System.out.println(temp);
104                 for(int k=0; k<s[temp].size();k++){
105                     Add[(int) s[temp].get(k)]=1;
106                 }
107                 Checked[temp]=1;    Number++;        
108             }
109             //System.out.println(Number);
110             if(Number==length)
111                 return true;
112             else
113                 return false;
114         }
115 
116         
117         public void DNF(ArrayList[] s, int start){
118             
119             while(true){
120                 
121                    if(s[start].size()>0){                       
122                        int temp = (Integer)s[start].get(0);
123                        s[start].remove(0);
124                        s[temp].remove((Integer)start);
125                        DNF(s, temp);                
126                    }    
127                    else 
128                        break;
129             }
130             result.add(start+1);
131             //System.out.print(start);
132             
133         }
134 }
原文地址:https://www.cnblogs.com/udld/p/4574996.html