[백준] 1967번: 트리의 지름

2018. 5. 31. 02:41알고리즘

 

1967번: 트리의 지름

파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n번째 줄까지 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연결하는 두 노드 중 부모 노드의 번호를 나타내고, 두 번째 정수는 자식 노드를, 세 번째 정수는 간선의 가중치를 나타낸다. 간선에 대한 정보는 부모 노드의 번호가 작은 것이 먼저 입력되고, 부모 노드의 번호가 같으면 자식 노드의 번호가 작은 것이 먼

www.acmicpc.net

 

 

이전에 풀었던 1167번 문제와 아주 유사합니다.

 

 

[백준] 1167번: 트리의 지름

1167번: 트리의 지름 트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2≤V≤100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. (정점 번호는 1..

ga0n.tistory.com

 

 

저는 1167번 문제에서 input 함수 내용만 조금 바꿨습니다.

 

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

struct node {
  int num;
  int dist;

  node(int num, int dist) : num(num), dist(dist) {};
};

int N;
vector<vector<node> > tree;
vector<bool> isChecked;
vector<long long> distanceFromRoot;

void input() {
  cin >> N;
  tree.resize(N + 1);
  isChecked.resize(N + 1);
  distanceFromRoot.resize(N + 1);

  for (int i = 0; i < N - 1; i++) {
    int vNum;
    cin >> vNum;

    int cvNum;
    int cvDist;
    cin >> cvNum >> cvDist;
    tree[vNum].push_back(node(cvNum, cvDist));
    tree[cvNum].push_back(node(vNum, cvDist));
  }
}

void initArray() {
  for (int i = 1; i <= N; i++) {
    isChecked[i] = false;
    distanceFromRoot[i] = -1;
  }
}

void bfs(int root) {
  initArray();

  queue<int> q;
  q.push(root);
  isChecked[root] = true;
  distanceFromRoot[root] = 0;

  while (!q.empty()) {
    int x = q.front();
    q.pop();

    for (node n : tree[x]) {
      int nx = n.num;
      int dist = n.dist;

      if (!isChecked[nx]) {
        isChecked[nx] = true;
        distanceFromRoot[nx] = distanceFromRoot[x] + dist;
        q.push(nx);
      }
    }
  }
}

int findNewRootNode(int root) {
  int newRoot = -1;
  long long dist = -1;
  bfs(root);

  for (int i = 1; i <= N; i++) {
    if (dist == -1 || dist < distanceFromRoot[i]) {
      dist = distanceFromRoot[i];
      newRoot = i;
    }
  }
  return newRoot;
}

void printAnswer(int farthestNode) {
  cout << distanceFromRoot[farthestNode] << '\n';
}

int main() {
  ios::sync_with_stdio(false);

  input();
  int newRoot = findNewRootNode(1);
  int farthestNode = findNewRootNode(newRoot);
  printAnswer(farthestNode);

  return 0;
}

'알고리즘' 카테고리의 다른 글

[백준] 1931번: 회의실 배정  (0) 2018.06.02
[백준] 11047번: 동전 0  (0) 2018.05.31
[백준] 1167번: 트리의 지름  (0) 2018.05.31
[백준] 11725번: 트리의 부모 찾기  (0) 2018.05.30
[백준] 9663번: N-Queen  (0) 2018.05.30