Hiho---欧拉图

欧拉路·一

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

描述

小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找到最后的宝藏。现在他们控制的角色来到了一个很大的湖边。湖上有N个小岛(编号1..N),以及连接小岛的M座木桥。每座木桥上各有一个宝箱,里面似乎装着什么道具。

湖边还有一个船夫,船夫告诉主角。他可以载着主角到任意一个岛上,并且可以从任意一个岛上再载着主角回到湖边,但是主角只有一次来回的机会。同时船夫告诉主角,连接岛屿之间的木桥很脆弱,走过一次之后就会断掉。

因为不知道宝箱内有什么道具,小Hi和小Ho觉得如果能把所有的道具收集齐肯定是最好的,那么对于当前岛屿和木桥的情况,能否将所有道具收集齐呢?

举个例子,比如一个由6个小岛和8座桥组成的地图:

主角可以先到达4号小岛,然后按照4->1->2->4->5->6->3->2->5的顺序到达5号小岛,然后船夫到5号小岛将主角接回湖边。这样主角就将所有桥上的道具都收集齐了。

提示:欧拉路的判定

输入

第1行:2个正整数,N,M。分别表示岛屿数量和木桥数量。1≤N≤10,000,1≤M≤50,000

第2..M+1行:每行2个整数,u,v。表示有一座木桥连接着编号为u和编号为v的岛屿,两个岛之间可能有多座桥。1≤u,v≤N

输出

第1行:1个字符串,如果能收集齐所有的道具输出“Full”,否则输出”Part”。

样例输入
6 8
1 2
1 4
2 4
2 5
2 3
3 6
4 5
5 6
样例输出
Full


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