[BOJ 15971] 두 로봇

2023. 4. 25. 23:18Baekjoon

728x90

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

 

15971번: 두 로봇

입력에서 두 번째 줄에 주어지는 방번호는 1과 2, 세 번째 줄에 주어지는 방 번호는 2와 3, …, i번째 줄에 주어지는 방 번호는 i-1과 i, …, N번째 줄에 주어지는 방 번호는 N-1과 N이다 (아래 입력과

www.acmicpc.net

 

- 문제 요약

 

2018년 강원도에서 새로운 동굴이 발견되었다. 이 동굴에는 총 N개의 넓은 방이 존재하며 좁은 통로로 서로 연결되어 있는 것으로 밝혀졌다. N개의 방은 1번부터 N번까지의 번호를 붙여 1번 방, 2번 방, …, N번 방으로 부른다. 통로는 정확히 N-1개가 발견되었는데, 각각 서로 다른 두 방 사이를 연결시켜 주며 중간에 다른 통로와 이어지는 경우는 없다고 한다. 또한 이 통로들을 이용하여 임의의 두 방 사이를 이동하는 것이 가능하며, 임의의 두 방 사이를 이동할 때 같은 통로를 두 번 이상 지나지 않는 경로는 유일한 것으로 밝혀졌다.

새로 발견된 동굴을 조사하기 위해 동굴 탐사 로봇 두 대를 이용하기로 하였다. 두 로봇은 어떤 시점이 되면 각자가 획득한 정보를 공유하기 위해 통신을 해야 한다. 두 로봇이 서로 통신을 하기 위해서는 동굴 내의 같은 통로 위에 위치해야만 한다. 참고로 임의의 통로의 양 끝에 위치한 두 방들도 그 통로 위에 위치해 있다고 간주한다.

<그림 1> 동굴 내부를 간략히 표현한 그림

<그림 1>은 방이 9개인 동굴 내부를 간략하게 나타낸 예이다. <그림 1>에서 방은 원으로 표현되어 있으며 원 안의 수는 방 번호이다. 8개의 통로는 두 원 사이의 선분으로 표시되어 있으며 그 위의 정수 값이 통로의 길이이다. 예를 들어, 5번 방과 9번 방 사이에 길이가 6 인 통로가 있음을 알 수 있다. 만약 두 로봇이 1번 방과 9번 방에 위치해 있다면, 각각 2번 방과 5번 방으로 이동한 후 통신할 수 있으며 이때 이동한 거리의 합은 14로 최소이다.

동굴 내의 통로에 대한 정보와 두 로봇의 현재 위치가 입력으로 주어질 때, 서로 통신하기 위해 이동해야 하는 거리의 합의 최솟값을 계산하는 프로그램을 작성하시오.

동굴의 각 통로는 양 끝에 위치한 두 방의 번호와 그 길이로 주어진다. 두 로봇의 위치는 방 번호로 주어진다.

 

 

- 알고리즘 정리

 

문제에서 노드는 N개, 간선은 N-1개가 있다고 했습니다.

한 번 지난 노드를 재방문할 수 없다고 했으니 (출발->도착)의 경로가 최단경로가 됩니다.

두 로봇의 시작점 사이의 거리에서 가장 긴 간선의 길이를 빼주면 답을 구할 수 있습니다.

(탐색은 BFS, DFS 다 가능하지만 전 DFS로 했습니다)

 

 

- 코드 작성

 

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

#define MAX 100001
int n,w1,w2;
vector<pair<int,int> >v[MAX];
bool check[MAX],flag;

void dfs(int x,int sum,int mx){
	if(flag){
		return;
	}
	if(x==w2){
		cout<<sum-mx<<'\n';
		flag=true;
		return;
	}
	for(int i=0;i<v[x].size();i++){
		int nx=v[x][i].first;
		int ny=v[x][i].second;
		if(check[nx]==0){
			check[nx]=true;
			dfs(nx,sum+ny,max(ny,mx));
		}
	}
	return;
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin>>n>>w1>>w2;
	for(int i=0;i<n-1;i++){
		int a,b,c;
		cin>>a>>b>>c;
		v[a].push_back({b,c});
		v[b].push_back({a,c});
	}
	check[w1]=true;
	dfs(w1,0,0);
}

코드 제출 결과

728x90

'Baekjoon' 카테고리의 다른 글

[BOJ 2923] 숫자 게임  (0) 2023.04.27
[BOJ 2613] 숫자구슬  (0) 2023.04.26
[BOJ 20188] 등산 마니아  (0) 2023.04.24
[BOJ 9497] 피라미드 수열  (1) 2023.04.23
[BOJ 11402] 이항 계수 4  (0) 2023.04.22