문제풀이/백준oj

[백준OJ] 9370번 미확인 도착지

Hyeon-Uk 2021. 9. 11. 23:30
반응형

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

 

9370번: 미확인 도착지

(취익)B100 요원, 요란한 옷차림을 한 서커스 예술가 한 쌍이 한 도시의 거리들을 이동하고 있다. 너의 임무는 그들이 어디로 가고 있는지 알아내는 것이다. 우리가 알아낸 것은 그들이 s지점에서

www.acmicpc.net


 

풀이

최단거리를 구하기 위한 알고리즘 중 다익스트라 알고리즘을 이용했다.

다익스트라 알고리즘을 이용해서, 먼저 S지점, H지점, G지점에서 각각 모든지점까지의 최단거리를 구해준다.

그런뒤, S에서 각 목적지까지의 거리가, S->H->G->목적지 또는 S->G->H->목적지 까지의 거리와 같다면, 요란한 옷차림을 한 서커스 예술가들이 H와 G도시 사이에 있는 경로를 지나왔다는 의미가 되므로, 위의 조건을 만족하는 목적지들을 출력해주면 된다.

 

반응형

코드

#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
#define MAX	987654321
using namespace std;

typedef pair<int, int> pii;

int T;
int n, m, t;
int s, g, h;

void input(vector<pii> *maze,vector<int>& check) {
	cin >> n >> m >> t;
	cin >> s >> g >> h;
	check.resize(t);
	for (int i = 0; i < m; i++) {
		int a, b, d;
		cin >> a >> b >> d;
		maze[a].push_back({ b,d });
		maze[b].push_back({ a,d });
	}
	for (int i = 0; i < t; i++) {
		cin >> check[i];
	}
	sort(check.begin(), check.end());
}

bool trace(int a, int b) {
	return ((a == g && b == h) || (a == h && b == g));
}

vector<int> dijk(vector<pii> *maze,int st) {
	vector<int> dist(n+1,MAX);
	queue<pii> q;
	dist[st] = 0;
	q.push({ st,0 });
	while (!q.empty()) {
		int now = q.front().first;
		int distance = q.front().second;
		q.pop();

		if (distance > dist[now]) {
			continue;
		}

		for (auto k : maze[now]) {
			int next = k.first;
			int cost = k.second+distance;

			if (cost < dist[next]) {
				q.push({ next, cost });
				dist[next] = { cost };
			}
		}
	}

	return dist;
}

int main() {
	cin >> T;
	while (T--) {
		vector<pii> maze[2001];
		vector<int> check;
		input(maze,check);
		vector<int> start=dijk(maze, s);
		vector<int> vh = dijk(maze, h);
		vector<int> vg = dijk(maze, g);

		for (int c : check) {
			int dist = start[c];// s->목적지까지의 최단거리
			int dist_shgc = start[h] + vh[g] + vg[c]; //s->h->g->c까지의 최단거리
			int dist_sghc = start[g] + vg[h] + vh[c]; //s->g->h->c까지의 최단거리
			if (dist == dist_shgc || dist == dist_sghc) {
				cout << c << " ";
			}
		}
		cout << "\n";
	}
}

 

 

 

반응형