ํธ๋ฆฌ์ ์ง๋ฆ ์ฑ๊ณต
2 ์ด 128 MB 29437 11906 9017 42.228% ๋ฌธ์
ํธ๋ฆฌ(tree)๋ ์ฌ์ดํด์ด ์๋ ๋ฌด๋ฐฉํฅ ๊ทธ๋ํ์ด๋ค. ํธ๋ฆฌ์์๋ ์ด๋ค ๋ ๋ ธ๋๋ฅผ ์ ํํด๋ ๋ ์ฌ์ด์ ๊ฒฝ๋ก๊ฐ ํญ์ ํ๋๋ง ์กด์ฌํ๊ฒ ๋๋ค. ํธ๋ฆฌ์์ ์ด๋ค ๋ ๋ ธ๋๋ฅผ ์ ํํด์ ์์ชฝ์ผ๋ก ์ซ ๋น๊ธธ ๋, ๊ฐ์ฅ ๊ธธ๊ฒ ๋์ด๋๋ ๊ฒฝ์ฐ๊ฐ ์์ ๊ฒ์ด๋ค. ์ด๋ด ๋ ํธ๋ฆฌ์ ๋ชจ๋ ๋ ธ๋๋ค์ ์ด ๋ ๋ ธ๋๋ฅผ ์ง๋ฆ์ ๋ ์ ์ผ๋ก ํ๋ ์ ์์ ๋ค์ด๊ฐ๊ฒ ๋๋ค.
์ด๋ฐ ๋ ๋ ธ๋ ์ฌ์ด์ ๊ฒฝ๋ก์ ๊ธธ์ด๋ฅผ ํธ๋ฆฌ์ ์ง๋ฆ์ด๋ผ๊ณ ํ๋ค. ์ ํํ ์ ์ํ์๋ฉด ํธ๋ฆฌ์ ์กด์ฌํ๋ ๋ชจ๋ ๊ฒฝ๋ก๋ค ์ค์์ ๊ฐ์ฅ ๊ธด ๊ฒ์ ๊ธธ์ด๋ฅผ ๋งํ๋ค.
์ ๋ ฅ์ผ๋ก ๋ฃจํธ๊ฐ ์๋ ํธ๋ฆฌ๋ฅผ ๊ฐ์ค์น๊ฐ ์๋ ๊ฐ์ ๋ค๋ก ์ค ๋, ํธ๋ฆฌ์ ์ง๋ฆ์ ๊ตฌํด์ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ์๋์ ๊ฐ์ ํธ๋ฆฌ๊ฐ ์ฃผ์ด์ง๋ค๋ฉด ํธ๋ฆฌ์ ์ง๋ฆ์ 45๊ฐ ๋๋ค.
ํธ๋ฆฌ์ ๋ ธ๋๋ 1๋ถํฐ n๊น์ง ๋ฒํธ๊ฐ ๋งค๊ฒจ์ ธ ์๋ค.
์ ๋ ฅ
ํ์ผ์ ์ฒซ ๋ฒ์งธ ์ค์ ๋ ธ๋์ ๊ฐ์ n(1 ≤ n ≤ 10,000)์ด๋ค. ๋์งธ ์ค๋ถํฐ n-1๊ฐ์ ์ค์ ๊ฐ ๊ฐ์ ์ ๋ํ ์ ๋ณด๊ฐ ๋ค์ด์จ๋ค. ๊ฐ์ ์ ๋ํ ์ ๋ณด๋ ์ธ ๊ฐ์ ์ ์๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ์ฒซ ๋ฒ์งธ ์ ์๋ ๊ฐ์ ์ด ์ฐ๊ฒฐํ๋ ๋ ๋ ธ๋ ์ค ๋ถ๋ชจ ๋ ธ๋์ ๋ฒํธ๋ฅผ ๋ํ๋ด๊ณ , ๋ ๋ฒ์งธ ์ ์๋ ์์ ๋ ธ๋๋ฅผ, ์ธ ๋ฒ์งธ ์ ์๋ ๊ฐ์ ์ ๊ฐ์ค์น๋ฅผ ๋ํ๋ธ๋ค. ๊ฐ์ ์ ๋ํ ์ ๋ณด๋ ๋ถ๋ชจ ๋ ธ๋์ ๋ฒํธ๊ฐ ์์ ๊ฒ์ด ๋จผ์ ์ ๋ ฅ๋๊ณ , ๋ถ๋ชจ ๋ ธ๋์ ๋ฒํธ๊ฐ ๊ฐ์ผ๋ฉด ์์ ๋ ธ๋์ ๋ฒํธ๊ฐ ์์ ๊ฒ์ด ๋จผ์ ์ ๋ ฅ๋๋ค. ๋ฃจํธ ๋ ธ๋์ ๋ฒํธ๋ ํญ์ 1์ด๋ผ๊ณ ๊ฐ์ ํ๋ฉฐ, ๊ฐ์ ์ ๊ฐ์ค์น๋ 100๋ณด๋ค ํฌ์ง ์์ ์์ ์ ์์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ํธ๋ฆฌ์ ์ง๋ฆ์ ์ถ๋ ฅํ๋ค.
์์ ์ ๋ ฅ 1 ๋ณต์ฌ
12 1 2 3 1 3 2 2 4 5 3 5 11 3 6 9 4 7 1 4 8 7 5 9 15 5 10 4 6 11 6 6 12 10
45
ํธ๋ฆฌ๋ฌธ์ ์ด๋ค.
์ฒ์์ ์๊ฐ๊ณ์ฐํ ๋ N^2logE๋ฉด ํ๋ฆด์ค ์๊ณ ๊ทธ๋ฅ ๋ค์ต์คํธ๋ผ ๋น์ทํ๊ฒ ๋ง๋ค์ด์ ๋ฐ์๋๋ฐ ์ํ๋ ธ๋ค.
์์ธ์ง ๋ค์ ๊ณ์ฐํด๋ณด๋
1. 1์ด๊ฐ ๊ฑธ๋ฆฌ๋ ๊ฒฝ์ฐ๊ฐ 10^9 ๋ก ์๊ณ ์์๋๋ฐ, ๋ค์ ์ฐพ์๋ณด๋ 10^8 ์ ๋์๋ค. ์ด๋ฌ๋ฉด N^2์ด ๋์ด๊ฐ๋ ์ฐ์ฐ์ ์ ๋ ํ๋ฆด ์ ์๋ค.
2. ์ ์ง ๋ค์ต์คํธ๋ผ์์ pq๋ฅผ ์ฌ์ฉํ์ฌ NlogE๋ฅผ ๋ง๋๋๋ฐ, ์์ ๋ฌธ์ ๋ ์ต๋จ๊ฑฐ๋ฆฌ๊ฐ ์๋ ์ต์ฅ๊ฑฐ๋ฆฌ ์ด๋ฏ๋ก ๊ฒฐ๊ตญ ๋ชจ๋ ๋ ธ๋, ๋ชจ๋ ๊ฐ์ ์ ๋ฐฉ๋ฌธํ๊ฒ ๋๋ค. ์ถ๋ฐ์ง๊ฐ ์ ํด์ ธ ์๋ ๋ค์ต์คํธ๋ผ๋ N๊ฐ์ ๋ ธ๋๋ฅผ ๋ชจ๋ ํ์ํด ์ฃผ์ด์ผ ํ๊ณ , ์๊ณ ๋ฆฌ์ฆ ์์ฒด๊ฐ N * N-1์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ N^3 ์ด๋ผ๋ ๋ง๋ ์๋๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ฒ ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์๋์ ์ฝ๋๋๋ก๋ ํ ์ ์์๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์์์ ์ 1 ๋ก ๊ณ ์ ๋์ด ์์ผ๋, ์ ์ผ ๊ฑฐ๋ฆฌ๊ฐ ๋จผ ์ง์ ํ๋๋ฅผ ๊ตฌํ์ฌ ์ด ๋๋ฒ์ ํ์์ ๋๋ฆด ์ ์๊ฒ ํ์๋ค.
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#define INF 987654321
using namespace std;
int N, ans;
vector<vector<pair<int,int>>>tree(10001);
pair<int,int> dy(int id){
vector<int>dist(10001, -1);
dist[id] = 0;
priority_queue<pair<int,int>,vector<pair<int,int>>>pq;
int vis[10001]={0};
pq.push({0,id});
vis[id] = 1;
while(!pq.empty()){
int cur_node = pq.top().second;
int cur_dist = pq.top().first;
pq.pop();
for(auto edge : tree[cur_node]){
int nxt_node = edge.first;
int nxt_dist = cur_dist + edge.second;
if(vis[nxt_node]) continue;
if(nxt_dist > dist[nxt_node]){
dist[nxt_node] = nxt_dist;
pq.push({nxt_dist,nxt_node});
vis[nxt_node] = 1;
}
}
}
int idx=1, idxc = 0;
for(int i=1; i<=N; i++){
if(dist[i] == -1) continue;
if(dist[i] > dist[idx])
idx = i;
idxc = max(idxc, dist[i]);
}
// for(int i=1; i<=N; i++)
// cout<<dist[i]<<' ';
// cout<<endl;
return {idx,idxc};
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
cin>>N;
for(int i=0; i<N-1; i++){
int a, b, c;
cin>>a>>b>>c;
tree[a].push_back({b,c});
tree[b].push_back({a,c});
}
auto ver = dy(1);
cout<<dy(ver.first).second;
}
์ฒ์ ํ์ด๋ฅผ ์ต๋ํ ์ด๋ ค์ ์ฝ๋๊ฐ ๋๋ฝ๊ณ , ์๊ฐ๋ ๊ฐ๋น๊ฐ๋นํ๊ฒ ๋์๋ค.
๊ทธ๋ฅ DFS๋ก ์ง๋ฉด ์ด๊ฒ๋ณด๋ค ํจ์ฌ ๊ฐ๊ฒฐํด์ง๋ค.