[java]트리의 지름 - 백준1167
문제
풀이
문제 해석을 하자면,
- 트리가 주어지며, 제일 큰 너비를 구하는 문제이다.
풀이
- 구글링의 힘을 조금 빌린 문제 ㅜㅜ
- DFS를 처음 임의의 노드에서 1번, 이를 통해서 찾아낸 제일 거리먼 노드에서 1번 하면 끝
코드
/**
* 구글링의 힘을 조금 빌린 문제
* DFS를 처음 임의의 노드에서 1번, 이를 통해서 찾아낸 제일 거리먼 노드에서 1번 하면 됨
*/
static List<Node>[] inArr = new ArrayList[100005];
static boolean[] visited = new boolean[100005];
static int V, maxNode, maxVal;
static void dfs(int val, int node) {
// base condition -> visited
if(maxVal < val) {
maxVal = val; // 가중치 합
maxNode = node; // 해당 노드
}
// recursion
for(Node nxt : inArr[node]) {
if(visited[nxt.nxt]) continue;
visited[nxt.nxt] = true;
dfs(val+nxt.w, nxt.nxt);
visited[nxt.nxt] = false; // backtracking
}
}
public static void main(String[] args) throws IOException {
// input
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk;
V = Integer.parseInt(br.readLine());
for(int i = 0 ; i<V+5; i++) inArr[i] = new ArrayList<>(); // init
for(int i = 0 ; i<V; i++) {
stk = new StringTokenizer(br.readLine(), " ");
int a = Integer.parseInt(stk.nextToken());
while(true) {
int b = Integer.parseInt(stk.nextToken());
if(b==-1) break; // 입력 끝인지 확인
int c = Integer.parseInt(stk.nextToken());
inArr[a].add(new Node(b, c));
}
}
// run
visited[1] = true; // 임의의 노드 1
dfs(0, 1);
visited[1] = false;
visited[maxNode] = true; // 제일 먼 노드 maxNode
dfs(0, maxNode);
visited[maxNode] = false;
// output
System.out.println(maxVal);
}
static class Node {
int nxt, w;
public Node(int nxt, int w) {
this.nxt = nxt; this.w = w;
}
}
느낀점
다시 풀어보자.
댓글남기기