Algorithm/그래프
[틀림] 백준 1167 트리의 지름 // 거리는? bfs, 트리개념
Mini_96
2025. 3. 26. 23:55
https://www.acmicpc.net/problem/1167
* 풀이
- (최단) 거리는? 무조건 bfs
- 어느한곳에서 최장거리노드 -> 지름의 노드 중1개
- 증명 : 귀류법
- 찾은 노드에서 시작해서 가장먼곳을 찾으면 지름의 두쌍을 찾은것임.
- 주의
- 1-idx임에주의
- vis를 n+1까지 돌리고
- 찾을때도 n+1까지 찾아야함
- bfs2번주의
- vis[node1]=1로 시작해야함
- vis[1]=1 아님.
- 1-idx임에주의
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int v,ret;
int vis[100000+4];
vector<pair<int,int>> adj[100000+4]; // <정점, 거리>
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin>>v;
for(int i=0;i<v;++i) {
int a;
cin>>a;
while(1) {
int b,c;
cin>>b;
if(b==-1) {
break;
}
cin>>c;
adj[a].push_back({b,c});
}
}
queue<int> q;
q.push(1);
vis[1]=1; //후처리 -1 필요, 방문처리별도로 안해도됨
while(q.size()) {
int cur = q.front();
q.pop();
for(auto nxt : adj[cur]) {
if(vis[nxt.first]) {
continue;
}
vis[nxt.first] += vis[cur]+nxt.second;
q.push(nxt.first);
}
}
int mx = *max_element(vis,vis+v+1); // 1-idx임에주의
int node1=0;
for(int i=0;i<=v;++i) { // 1-idx임에주의
if(mx==vis[i]) {
node1=i;
break;
}
}
// cout<<mx<<"\n";
// cout<<node1;
memset(vis,0,sizeof(vis));
// queue<int> q2;
q.push(node1);
vis[node1]=1; //후처리 -1 필요, 방문처리별도로 안해도됨
while(q.size()) {
int cur = q.front();
q.pop();
for(auto nxt : adj[cur]) {
if(vis[nxt.first]) {
continue;
}
vis[nxt.first] += vis[cur]+nxt.second;
q.push(nxt.first);
}
}
int mx2 = *max_element(vis,vis+v+1); // 1-idx임에주의
int node2=0;
for(int i=0;i<=v;++i) { // 1-idx임에주의
if(mx2==vis[i]) {
node2=i;
break;
}
}
cout<<vis[node2]-1;
return 0;
}