티스토리 뷰

반응형

dfs를 이용하여 푸는 문제이다.

풀이를 생각해보는데 쉽게 떠오르지 않았다.

고민 끝에 다른사람의 풀이를 참고하였다.

 

<문제>

https://www.acmicpc.net/problem/1967

 

1967번: 트리의 지름

파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연

www.acmicpc.net

 

 

<참고해서 푼 풀이>

#include<bits/stdc++.h>
using namespace std;

vector<pair<int,int>> node[10002];
bool visited[10002] = {false,};
int result = 0;
int endPoint = 0;

void dfs(int p, int len){
  if(visited[p]) return;
  
  visited[p] = true;
  if(result < len){
    result = len;
    endPoint = p;
  }
  
  for(int i=0; i<node[p].size(); i++){
    dfs(node[p][i].first, len + node[p][i].second);
  }
}

int main(){
  ios::sync_with_stdio(0);
  cin.tie(0); cout.tie(0);
  
  int n;
  cin>>n;
  
  for(int i=0; i<n-1; i++){
    int a,b,c;
    cin>>a>>b>>c;
    node[a].push_back({b,c});
    node[b].push_back({a,c});
  }
  
  dfs(1,0);  //가장 멀리있는 점 구하기
  
  result = 0;
  memset(visited, false, sizeof(visited));
  
  dfs(endPoint, 0);  //지름 구하기
  cout<<result;
}

 

원의 내부에서 가장 끝 점에 있는 두 지점이 지름에 해당하기 때문에

어떤 정점에서 출발을 해도 가장 멀리 있는 지점은 원의 지름에 해당하는 두 정점중에 하나일 것이다.

 

그래서 어떤 한 정점에서 dfs를 수행하여 가장 멀리 있는 지점을 찾은 후에

그 지점에서 다시 dfs를 수행해 가장 멀리 있는 지점과의 거리 즉, 지름을 구하면 된다.

 

위 논리를 생각한다면 어렵지 않게 풀었을 문제인데 생각하지 못했다.

 

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday