Pku1386 Play on Words

各単語をエッジと考えたグラフでオイラーパスが存在するかどうか調べる.

SPOJの方にも同じ問題がある.こっちはRubyで通したかったのだけど,入力を読んで初めの文字と終わりの文字をとってくるだけでTLEになるので保留.

import java.util.*;
public class Main {
	static boolean isConnect(int adj[][],boolean mustVisit[]){
		boolean visited[] = new boolean[adj.length];
		int start = -1;
		for(int i=0;i<26;i++){
			if(mustVisit[i]){
				start = i;
				break;
			}
		}
		Queue<Integer> q = new LinkedList<Integer>();
		q.add(start);
		visited[start] = true;
		while(!q.isEmpty()){
			int cp = q.poll();
			for(int i=0;i<adj.length;i++){
				if(visited[i])continue;
				if(adj[cp][i]>0 || adj[i][cp]>0){
					visited[i] = true;
					q.add(i);
				}
			}
		}
		for(int i=0;i<visited.length;i++){
			if(!visited[i] && mustVisit[i])return false;
		}
		return true;
	}
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int t = sc.nextInt();
		for(int i=0;i<t;i++){
			int n = sc.nextInt();
			boolean mustVisit[] = new boolean[26];
			int adj[][] = new int[26][26];
			int in[] = new int[26];
			int out[] = new int[26];
			for(int j=0;j<n;j++){
				String s = sc.next();
				int f = s.charAt(0)-'a';
				int l = s.charAt(s.length()-1)-'a'; 
				adj[f][l]++;
				in[l]++;
				out[f]++;
				mustVisit[l] = true;
				mustVisit[f] = true;
			}
			if(isConnect(adj, mustVisit)){
				int sum = 0;
				for(int j=0;j<in.length;j++)sum+=Math.abs(in[j]-out[j]);
				if(sum==0 || sum==2){
					System.out.println("Ordering is possible.");
				}else{
					System.out.println("The door cannot be opened.");				
				}				
			}else{
				System.out.println("The door cannot be opened.");				
			}
		}
	}
}