전공/알고리즘
백준 13424(비밀 모임)
xkdlaldfjtnl
2020. 10. 5. 15:25
13424번: 비밀 모임
입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에 테스트 케이스의 개수를 나타내는 자연수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 방
www.acmicpc.net
그래프로 최단 거리를 구하는 문제이다.
최단 거리 알고리즘은 대표적으로 다익스트라가 있는데 이 알고리즘은 1vsN이므로 이 문제에서 요구하는 NvsN과는 좀 맞지 않는다
그래서 NvsN의 최단거리 알고리즘인 플로이드 와샬을 사용한다.
그래프를 구현하고, 플로이드 와샬 이용, 원하는 값을 구한다.
주의해야 할 점은 본인과 본인의 거리는 0이다
#include<iostream>
#include<vector>
using namespace std;
#define MAX 105
int N, M, INF=987654321;
int T, K;
int main() {
cin >> T;
while (T--) {
int dist[MAX][MAX];
vector<int> v;
cin >> N >> M;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (i == j) {
dist[i][j] = 0;
continue;
}
dist[i][j] = INF;
}
}
for (int i = 0; i < M; i++) {
int a, b, c;
cin >> a >> b >> c;
dist[a][b] = c;
dist[b][a] = c;
}
cin >> K;
for (int i = 0; i < K; i++) {
int a;
cin >> a;
v.push_back(a);
}
for (int l = 1; l <= N; l++) {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (dist[i][l] + dist[l][j] < dist[i][j])
dist[i][j] = dist[i][l] + dist[l][j];
}
}
}
int min_n = INF;
int idx;
for (int i = 1; i <= N; i++) {
int sum = 0;
for (int j = 0; j < v.size(); j++) {
sum += dist[i][v[j]];
}
if (sum < min_n) {
min_n = sum;
idx = i;
}
}
cout << idx << '\n';
}
}