1 minute read

[no-alignment]

구현 방식

  • 최장거리를 만드는 노드를 A, B 라고할때
  • 한 노드에서부터 가장 먼 노드는 A 또는 B 이다.
  • 따라서 한 노드에서부터 가장 먼 노드 V1을 구하고, V1 에서부터 가장 먼 노드 V2 를 구하면
  • 그게 바로 최장거리!
#include <string>
#include <cstring>
#include <vector>
#include <iostream>
#include <algorithm>
#include <stack>
#include <limits.h>
#include <map>

using namespace std;
void solution(int N, vector<vector<pair<int, int>>>& graph);
void Init(int N);
void dfs(int start, vector<vector<pair<int, int>>>& graph);

int dist[10001];
int maxDistIdx = -1;
int maxDist = INT_MIN;

int main()
{
    int N;
    cin >> N;
    vector<vector<pair<int,int>>> graph = vector<vector<pair<int, int>>>(N + 1, vector<pair<int, int>>());
    for (int i = 0; i < N-1; i++)
    {
        int from, to, w;
        cin >> from >> to >> w;
        graph[from].push_back({to, w});
        graph[to].push_back({ from, w });
    }

    

    solution(N, graph);
}
void solution(int N, vector<vector<pair<int, int>>>& graph)
{
    int start = 1;
    Init(N);
    dfs(start, graph);
    start = maxDistIdx;
    Init(N);
    dfs(start, graph);

    cout << maxDist << endl;
}

void Init(int N)
{
    fill_n(dist, N + 1, INT_MIN);
    maxDistIdx = -1;
    maxDist = INT_MIN;
}

void dfs(int start , vector<vector<pair<int, int>>>& graph)
{
    stack<int> s;
    s.push(start);
    dist[start] = 0;
    maxDist = 0;
    while (!s.empty())
    {
        int currIdx = s.top();
        s.pop();

        for (pair<int, int> toWeight : graph[currIdx])
        {
            int to = toWeight.first;
            int weight = toWeight.second;
            if (dist[to] == INT_MIN)
            {
                dist[to] = dist[currIdx] + weight;
                s.push(to);
                if (dist[to] > maxDist)
                {
                    maxDist = dist[to];
                    maxDistIdx = to;
                }
            }
        }
    }

}