[백준] 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 |