백준 No.1167 [트리의 지름]
본문 바로가기
Algorithm (C++ based)/BOJ

백준 No.1167 [트리의 지름]

by 조훈이 2022. 11. 28.

백준 No.1167 [트리의 지름]


  문제 

1167번: 트리의 지름 (acmicpc.net)

 

1167번: 트리의 지름

트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지

www.acmicpc.net


  설명 

 <알고리즘 분류> 
 * DFS

백준 No.1967 [트리의 지름] (tistory.com)

 

백준 No.1967 [트리의 지름]

백준 No.1967 [트리의 지름] 문제 1967번: 트리의 지름 (acmicpc.net) 1967번: 트리의 지름 파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온

johoonday.tistory.com

  현재 이 문제는 위 링크에서 설명되는 1967번 [트리의 지름] 문제와 정점의 개수 / 간선의 가중치의 범위정점, 간선이 입력되는 방식 말고는 다를게 없는 문제이다. 트리의 지름을 구하는 접근 방식은 100.00 % 동일하다.


  Code 

더보기
#include <iostream>
#include <vector>
#include <cstring>
#define N 100001

using namespace std;

struct s1 {
    int nxt;
    int dist;
};

int n;
int maxVal = 0;
int maxNode = 0;
vector<s1> nodes[N];
bool visit[N];

void dfs(int cur, int val) {
    visit[cur] = true;

    if (maxVal < val) {
        ::maxVal = val;
        ::maxNode = cur;
    }

    for (int i = 0; i < nodes[cur].size(); i++) {
        int nxt = nodes[cur][i].nxt;

        if (!visit[nxt])
            dfs(nxt, val + nodes[cur][i].dist);
    }
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);

    cin >> n;

    int cur = 0;
    int nxt = 0;
    int dis = 0;

    for (int i = 1; i <= ::n; i++) {
        cin >> cur;

        while (cin >> nxt && nxt != -1) {
            cin >> dis;
            nodes[cur].push_back({nxt, dis});
        }
    }

    dfs(1, 0);          // 1번 정점에서 가장 먼 정점을 탐색
    memset(visit, false * sizeof(bool), N);
    dfs(::maxNode, 0);    // 탐색한 정점에서 다시 가장 먼 정점 탐색

    cout << ::maxVal;
}
728x90

'Algorithm (C++ based) > BOJ' 카테고리의 다른 글

백준 No.1944 [복제 로봇]  (0) 2023.02.05
백준 No.2008 [사다리 게임]  (0) 2022.12.04
백준 No.1967 [트리의 지름]  (0) 2022.11.28
백준 No.1725 [히스토그램]  (2) 2022.11.13
백준 No.1167 [트리의 지름]  (3) 2022.07.13

댓글