티스토리 뷰

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)를 동시에 구할 수 있습니다.

자세한 내용은 코드를 참고해주세용

 

 

 

정답 코드

#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;
}
view raw .cpp hosted with ❤ by GitHub

 

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함