CodeForce107A - Dorm Water Supply (find non-cycle end-to-end)

 이 문제는 사이클이 아닌 그래프의 시작과 끝을 찾는 문제이다.

또한 연결된 그래프의 어떤 값 이 문제에서는 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;
            }
        }
    }

}

이 블로그의 인기 게시물

웹툰 무료로 볼 수 있는 사이트

BackJoon 1011, Fly me to the alpha centauri, 규칙 찾기 문제

BaekJoon 6591, 이항 쇼다운 조합문제