hihocoder 1176 : 歐拉路·一

時間限制: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
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main {
	public boolean isEuler(HashMap<Integer,ArrayList<Integer>> map,int num){
		int count=0;
		for(Integer key:map.keySet()){
			ArrayList<Integer> list=map.get(key);
			if(list.size()%2==1) count++;
		}
		if(count!=2&&count!=0) return false;
		return isConnection(map, num);
	}
	public boolean isConnection(HashMap<Integer,ArrayList<Integer>> graph,int num){
		if(graph.size()==0) return true;
		int i=1;
		for(;i<=num;i++){
			if(graph.containsKey(i)) break;
		}
		HashSet<Integer> set=new HashSet<Integer>();
		Queue<Integer> queue=new LinkedList<Integer>();
		set.add(i); queue.add(i);
		while(!queue.isEmpty()){
			Integer a=queue.poll();
			set.add(a);
			ArrayList<Integer> list=graph.get(a);
			if(list==null) continue;
			for(Integer aa:list){
				if(set.contains(aa)) continue;
				queue.add(aa);
			}
		}
		return set.size()==num;
	}
	public static void main(String[] args) {
		Main main=new Main();
		Scanner scan=new Scanner(System.in);
		HashMap<Integer,ArrayList<Integer>> map=new HashMap<Integer,ArrayList<Integer>>();
		int vertexs=scan.nextInt();
		int num=scan.nextInt();
		for(int i=0;i<num;i++){
			int a=scan.nextInt();
			int b=scan.nextInt();
			if(!map.containsKey(a)) map.put(a, new ArrayList<Integer>());
			map.get(a).add(b);
			if(!map.containsKey(b)) map.put(b, new ArrayList<Integer>());
			map.get(b).add(a);
		}
		System.out.println(main.isEuler(map,vertexs)?"Full":"Part");
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章