티스토리 뷰
728x90
문제 링크
https://www.acmicpc.net/problem/15971
15971번: 두 로봇
2018년 강원도에서 새로운 동굴이 발견되었다. 이 동굴에는 총 N개의 넓은 방이 존재하며 좁은 통로로 서로 연결되어 있는 것으로 밝혀졌다. N개의 방은 1번부터 N번까지의 번호를 붙여 1번 방, 2번 방, …, N번 방으로 부른다. 통로는 정확히 N-1개가 발견되었는데, 각각 서로 다른 두 방 사이를 연결시켜 주며 중간에 다른 통로와 이어지는 경우는 없다고 한다. 또한 이 통로들을 이용하여 임의의 두 방 사이를 이동하는 것이 가능하며, 임의의 두 방 사
www.acmicpc.net
두 로봇은 인접한 노드에 있으면 통신이 가능합니다.
풀이
1) 두 로봇 사이 최단 거리를 dfs로 구해줍니다.
2) 위에서 구한 최단거리에서, 두 로봇 사이의 경로에 포함된 간선 중 가중치가 가장 큰 간선의 거리를 빼줍니다.
풀이를 두 단계로 적어놨지만 사실 dfs 한 번으로 1), 2)를 동시에 구할 수 있습니다.
자세한 내용은 코드를 참고해주세용
정답 코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <bits/stdc++.h> | |
using namespace std; | |
using pii = pair<int, int>; | |
#define ft first | |
#define sd second | |
int n, s1, s2; | |
struct Edge{ | |
int to; | |
int cost; | |
Edge(int t=0, int c=0):to(t), cost(c){} | |
}; | |
vector<vector<Edge>> p; | |
bool chk[110'000]; | |
pii zero = {0, 0}; | |
pii dfs(int now, pii ret){ | |
if(chk[now]) return zero; | |
chk[now] = true; | |
if(now == s2) return ret; | |
pii tmp; | |
for(auto e: p[now]){ | |
int next = e.to; | |
int ncost = e.cost; | |
if((tmp = dfs(next, {ret.ft + ncost, max(ret.sd, ncost)})).ft != 0) | |
return tmp; | |
} | |
return zero; | |
} | |
int main(){ | |
ios_base::sync_with_stdio(0); | |
cin.tie(0); | |
cin>>n>>s1>>s2; | |
p.resize(n+1); | |
for(int i=0; i<n-1; i++){ | |
int u, v, c; | |
cin>>u>>v>>c; | |
p[u].emplace_back(v, c); | |
p[v].emplace_back(u, c); | |
} | |
pii ans = dfs(s1, zero); | |
cout<<ans.ft - ans.sd; | |
} |
728x90
'알고리즘 > 문제 풀이' 카테고리의 다른 글
[BOJ] 백준 1726 로봇 (0) | 2019.12.14 |
---|---|
[BOJ] 백준 3649 로봇 프로젝트 (0) | 2019.10.15 |
[BOJ] 백준 17141 연구소2, 17142 연구소 3 (0) | 2019.10.15 |
[2019 숭고한 캠프] 백준 17392 우울한 방학 (1) | 2019.08.18 |
[2019 SCCC] 백준 17131 여우가 정보섬에 올라온 이유 (0) | 2019.06.04 |