結果
| 問題 |
No.1424 Ultrapalindrome
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-05-20 16:04:05 |
| 言語 | Java (openjdk 23) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,195 bytes |
| コンパイル時間 | 4,205 ms |
| コンパイル使用メモリ | 80,584 KB |
| 実行使用メモリ | 56,492 KB |
| 最終ジャッジ日時 | 2024-10-10 07:16:52 |
| 合計ジャッジ時間 | 19,741 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 WA * 1 |
| other | AC * 13 WA * 16 |
ソースコード
import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Comparator;
public class No1424 {
private static int N;
private static HashMap<Integer, List<Integer>> Edge;
private static List<Integer> S;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
N = scan.nextInt();
Edge = new HashMap<Integer, List<Integer>>();
for (int i=0; i < N-1; i++) {
int v = scan.nextInt() - 1;
int u = scan.nextInt() - 1;
Edge.getOrDefault(v, new ArrayList<Integer>()).add(u);
Edge.getOrDefault(u, new ArrayList<Integer>()).add(v);
}
scan.close();
S = new ArrayList<Integer>();
for (int i=0; i < N; i++) {
if (Edge.containsKey(i) && Edge.get(i).size() == 1) {
S.add(i);
}
}
int res = -1;
for (int i=0; i < S.size()-1; i++) {
int v = getPath(S.get(i), i);
if (v < 0) {
System.out.println("No");
return;
} else if (res < 0) {
res = v;
} else if (res != v) {
System.out.println("No");
return;
}
}
System.out.println("Yes");
}
private static class MyComparator implements Comparator {
public int compare(Object obj1, Object obj2) {
Integer[] num1 = (Integer[])obj1;
Integer[] num2 = (Integer[])obj2;
if(num1[0] > num2[0]) {
return 1;
} else if(num1[0] < num2[0]) {
return -1;
} else{
return 0;
}
}
}
private static int getPath(int s, int i) {
int[] D = new int[N];
Arrays.fill(D, Integer.MAX_VALUE);
D[s] = 0;
Queue<Integer[]> q = new PriorityQueue<Integer[]>(new MyComparator());
q.add(new Integer[] {0, s});
while (q.size() > 0) {
Integer[] c = q.poll();
if (c[0] > D[c[1]]) {
continue;
}
for (int p : Edge.get(c[1])) {
if (D[p] > D[c[1]] + 1) {
D[p] = D[c[1]] + 1;
q.add(new Integer[] {D[p], p});
}
}
}
int res = -1;
for (int e : S.subList(i+1, S.size())) {
if (res < 0) {
res = D[e];
} else if (res != D[e]) {
return -1;
}
}
return res;
}
}