순간을 성실히, 화려함보단 꾸준함을

[boj : 15971] 두 로봇 본문

알고리즘,SQL/백준,BOJ

[boj : 15971] 두 로봇

폭발토끼 2021. 1. 2. 22:44

www.acmicpc.net/problem/15971

 

15971번: 두 로봇

2018년 강원도에서 새로운 동굴이 발견되었다. 이 동굴에는 총 N개의 넓은 방이 존재하며 좁은 통로로 서로 연결되어 있는 것으로 밝혀졌다. N개의 방은 1번부터 N번까지의 번호를 붙여 1번 방, 2번

www.acmicpc.net

문제 : 두 로봇이 있고 같은 통로에 존재하도록 할때 소요되는 거리의 최소값을 구해라

 

해설 : n개의 정점이 주어지고 n-1개의 간선이 주어질때 무조건 '트리'라는 것을 파악할 수 있어야 된다.

어쨌건 두 로봇은 무조건 같은 통로에 있어야 하니 둘 사이에는 간선이 1개만 존재해야한다. 이는 x->y까지 가는 경로중에 가장 가중치가 높은 간선 1개만 빼주면 된다는 뜻.

 

정점을 하나씩 탐색해주고 목표(y)에 도달하면 return 시켜 역추적해주며 간선의 가중치들을 더해주자.

그 중 가장 큰 값 하나를 빼주면 된다.

 

#include<bits/stdc++.h>

using namespace std;

int n, x, y;
vector<pair<int,int>> v[100001];
int ans,m;

int dfs(int c, int p);

int main()
{	
	cin >> n >> x >> y;
	int a, b, c;
	for (int i = 0; i < n - 1; i++) {
		cin >> a >> b >> c;
		v[a].push_back({ b,c });
		v[b].push_back({ a,c });
	}
	dfs(x,-1);	
	cout << ans-m;
	return 0;
}
int dfs(int c,int p)
{
	if (c == y) 
		return 1;	
	for (pair<int, int> u : v[c])
		if (p != u.first)
			if (dfs(u.first, c)) {
				ans += u.second;
				m = max(m, u.second);
				return 1;
			}
	return 0;
}

'알고리즘,SQL > 백준,BOJ' 카테고리의 다른 글

[ boj : 2168] 문자판  (0) 2021.01.05
[boj : 1254] 팰린드롬 만들기  (0) 2021.01.04
[boj : 16569] 화산쇄설류  (0) 2021.01.02
[boj : 15922] 아우으 우아으이야!!  (0) 2020.12.24
[boj : 15886] 내 선물을 받아줘2  (0) 2020.12.24