algorithm

BOJ 1967

rkawk 2022. 9. 25. 13:46
๋”๋ณด๊ธฐ

ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„ ์„ฑ๊ณต

 

 

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๋กœ ์งœ๋ฉด ์ด๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•ด์ง„๋‹ค.

'algorithm' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

BOJ 1707  (0) 2022.09.27
BOJ 14501  (0) 2022.09.25
BOJ 1238  (0) 2022.09.17
BOJ 1504  (0) 2022.09.15
BOJ 1753 (Dijkstra)  (0) 2022.09.15