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 }