๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm ๐Ÿง‘๐Ÿป‍๐Ÿ’ป/๋ฐฑ์ค€(BOJ)

[๋ฐฑ์ค€,c++] 1167๋ฒˆ - ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„

by ์•ˆ์ฃผํ˜• 2022. 7. 26.

๋ฌธ์ œ

 

1167๋ฒˆ: ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„

ํŠธ๋ฆฌ๊ฐ€ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค. ๋จผ์ € ์ฒซ ๋ฒˆ์งธ ์ค„์—์„œ๋Š” ํŠธ๋ฆฌ์˜ ์ •์ ์˜ ๊ฐœ์ˆ˜ V๊ฐ€ ์ฃผ์–ด์ง€๊ณ  (2 ≤ V ≤ 100,000)๋‘˜์งธ ์ค„๋ถ€ํ„ฐ V๊ฐœ์˜ ์ค„์— ๊ฑธ์ณ ๊ฐ„์„ ์˜ ์ •๋ณด๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฃผ์–ด์ง„๋‹ค. ์ •์  ๋ฒˆํ˜ธ๋Š” 1๋ถ€ํ„ฐ V๊นŒ์ง€

www.acmicpc.net

 

์ฝ”๋“œ

#include <iostream>
#include <vector>
#include <memory.h>

using namespace std;
vector<pair<int,int>> graph[100001];

int max_len = 0, max_node;
bool visited[100001];

void find_max_len(int node, int len){
    visited[node] = true;
    if(len>max_len){
        max_node = node;
        max_len = len;
    }
    
    for(auto next: graph[node]){
        if(!visited[next.first]){
            visited[next.first] = true;
            find_max_len(next.first, len + next.second);
        }
    }
}


int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    int V; cin>>V;
    
    for(int i=0; i<V; i++){
        int node_a = 0, node_b, cost;
        for(int k=0;; k++){
            if(k==0) cin>>node_a>>node_b>>cost;
            else{
                cin>>node_b;
                if(node_b == -1) break;
                cin>>cost;
            }
            graph[node_a].push_back({node_b, cost});
        }
    }
    
    find_max_len(1, 0);
    memset(visited, 0 ,sizeof(visited));
    max_len = 0;
    find_max_len(max_node, 0);
    
    
    cout<<max_len;
}

 

ํ’€์ด

 

[๋ฐฑ์ค€,c++] 1967๋ฒˆ - ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„

๋ฌธ์ œ 1967๋ฒˆ: ํŠธ๋ฆฌ์˜ ์ง€๋ฆ„ ํŒŒ์ผ์˜ ์ฒซ ๋ฒˆ์งธ ์ค„์€ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ n(1 ≤ n ≤ 10,000)์ด๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ n-1๊ฐœ์˜ ์ค„์— ๊ฐ ๊ฐ„์„ ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋“ค์–ด์˜จ๋‹ค. ๊ฐ„์„ ์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ์„ธ ๊ฐœ์˜ ์ •์ˆ˜๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

dkswnkk.tistory.com

์œ ๋ช…ํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ด์ „์— ํ’€์—ˆ๋˜ ์œ„ ๋ฌธ์ œ์™€ ๊ฑฐ์˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์‹œ๊ฐ„ ์ดˆ๊ณผ์— ์œ ์˜ํ•ด์•ผ ํ•˜๋Š”๋ฐ ์ €๋Š” ์ฒ˜์Œ์— ์•„๋ž˜์™€ ๊ฐ™์ด ๋ชจ๋“  ๋…ธ๋“œ๋“ค์„ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ๊ฐ€์žฅ ๊ธด ์ง€๋ฆ„์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

for(int i=1; i<=V; i++){
	find_max_len(i, 0);
	memset(visited, 0 ,sizeof(visited));
}

ํ•˜์ง€๋งŒ ๋‹น์—ฐํ•˜๊ฒŒ๋„ ํ•ด๋‹น ์ฝ”๋“œ๋Š” O(100,000 ^ 100,000)์œผ๋กœ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. 

๊ณ ๋ฏผํ–ˆ๋˜ ๋ถ€๋ถ„์€ ๊ณผ์—ฐ ์–ด๋–ป๊ฒŒ ๊ฐ€์žฅ ๊ธด ๋…ธ๋“œ๋ฅผ ๋ฐ”๋กœ ์ฐพ์„ ์ˆ˜ ์žˆ์„๊นŒ ์ธ๋ฐ, ์‚ฌ์‹ค ์ด ๋ถ€๋ถ„์€ ๋”ฑ ํ•œ ๋ฒˆ๋งŒ ์•„๋ฌด ๋…ธ๋“œ๋‚˜ ์žก๊ณ  ๊ฐ€์žฅ ๋ฉ€๋ฆฌ ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์ฐพ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ์˜ ํŠธ๋ฆฌ ๊ทธ๋ฆผ

5
1 3 2 -1
2 4 4 -1
3 1 2 4 3 -1
4 2 4 3 3 5 6 -1
5 4 6 -1

์œ„์™€ ๊ฐ™์€ ์ž…์ถœ๋ ฅ์—์„œ ์–ด๋Š ๋…ธ๋“œ(1, 2, 3 ,4, 5)๋ฅผ ์žก๊ณ  ์‹œ์ž‘ํ•ด๋„ 1 ํ˜น์€ 5๋กœ ๋‚˜์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ 1์ด ๋‚˜์™”๋‹ค๋ฉด 1์—์„œ ๊ฐ€์žฅ ๋ฉ€๋ฆฌ ์žˆ๋Š” ๋…ธ๋“œ(5)๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๊ณ , 5๊ฐ€ ๋‚˜์™”๋‹ค๋ฉด 5์—์„œ ๊ฐ€์žฅ ๋ฉ€๋ฆฌ์žˆ๋Š” ๋…ธ๋“œ(1)๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์‹œ๊ฐ„๋ณต์žก๋„ O(100,000 + 100,000)๋งŒ์— ๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ“๊ธ€