1일1알

백준 13424번 비밀 모임 C++ 본문

알고리즘

백준 13424번 비밀 모임 C++

영춘권의달인 2022. 11. 25. 12:02

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

 

13424번: 비밀 모임

입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에 테스트 케이스의 개수를 나타내는 자연수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 방

www.acmicpc.net

 

플로이드-워셜

 

#include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#include <math.h>
#include <set>
#include <map>
#include <list>
#include <unordered_map>
#include <unordered_set>
#include <iomanip>
#include <limits.h>

using namespace std;
using int64 = long long;

int t, n, m;

vector<vector<int>> graph;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> t;
    while (t--) {
        cin >> n >> m;
        graph = vector<vector<int>>(n + 1, vector<int>(n + 1, -1));
        for (int i = 0; i < m; i++) {
            int a, b, c;
            cin >> a >> b >> c;
            graph[a][b] = c;
            graph[b][a] = c;
        }
        for (int i = 1; i <= n; i++) graph[i][i] = 0;
        for (int k = 1; k <= n; k++) {
            for (int i = 1; i <= n; i++) {
                for (int j = 1; j <= n; j++) {
                    if (graph[i][k] == -1) continue;
                    if (graph[k][j] == -1) continue;
                    if (graph[i][j] == -1) graph[i][j] = graph[i][k] + graph[k][j];
                    else graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j]);
                }
            }
        }
        int k;
        cin >> k;
        vector<int> friends(k);
        for (int i = 0; i < k; i++) {
            cin >> friends[i];
        }
        int minDist = INT_MAX;
        int room = -1;
        for (int i = 1; i <= n; i++) {
            int sum = 0;
            for (int j = 0; j < k; j++) {
                int currRoom = friends[j];
                sum += graph[currRoom][i];
            }
            if (sum < minDist) {
                minDist = sum;
                room = i;
            }
        }
        cout << room << "\n";
    }
}