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;
}
'Algorithm > 그래프' 카테고리의 다른 글
[알고리즘] 리트코드 course schedule // dfs cycle 감지 (0) | 2025.03.06 |
---|---|
[알고리즘] 백준 13244 Tree // tree의 조건 암기 (0) | 2025.01.18 |
리트코드 133 그래프 클론 c++ // 그래프 복사하는방법 (0) | 2024.05.20 |
프로그래머스 도넛과막대그래프 c++ // 그래프 차수 특징발견, 사이클검사방법, 최대번호노드 찾는방법 (0) | 2024.05.07 |
백준 1717 집합의표현 c++ // 유니온 파인드 구현방법 (0) | 2023.11.29 |