CodeForce107A - Dorm Water Supply (find non-cycle end-to-end)
이 문제는 사이클이 아닌 그래프의 시작과 끝을 찾는 문제이다.
또한 연결된 그래프의 어떤 값 이 문제에서는 diameter 즉 지름이 가장 작은 것을
출력하면 된다.
풀이: 하나만 연결 된 즉 리프 노드를 찾아 내고 그 것으로 시작하여
연결된 그래프를 찾아낸다.
또한 연결된 그래프의 어떤 값 이 문제에서는 diameter 즉 지름이 가장 작은 것을
출력하면 된다.
풀이: 하나만 연결 된 즉 리프 노드를 찾아 내고 그 것으로 시작하여
연결된 그래프를 찾아낸다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import java.util.Scanner; public class CodeForce107A { static int n, p, t = 0; static int[] vertex = new int[1005]; static int[] diameter = new int[1005]; static int[] vertexCount = new int[1005]; static ArrayList<Integer> start = new ArrayList<Integer>(); static int[] minList = new int[1005]; static int[] p1 = new int[1005]; static int[] p2 = new int[1005]; static boolean flag = false; public static void main(String[] args) { int x, y, z; Arrays.fill(minList, 1000000000); Scanner sc = new Scanner(System.in); n = sc.nextInt(); p = sc.nextInt(); for (int i = 0; i < p; i++) { x = sc.nextInt(); y = sc.nextInt(); z = sc.nextInt(); vertex[x]= y; diameter[x] = z; vertexCount[x]++; vertexCount[y]++; } for (int i = 0; i < vertex.length; i++) { if (vertexCount[i] == 1) { start.add(i); } } for (int i = 0; i < start.size(); i++) { p1[t] = start.get(i); dfs(start.get(i)); flag = false; t++; } System.out.println(start.size() / 2); for (int i= 0; i < start.size(); i++) { if (minList[i] != 1000000000) { System.out.println(p1[i] + " " + p2[i] + " " + minList[i]); } } } public static void dfs(int v){ if (vertex[v] != 0) { if (minList[t] > diameter[v] && diameter[v] != 0) { minList[t] = diameter[v]; } dfs(vertex[v]); } else { if (!flag) { p2[t] = v; flag = true; } } } } |