Problem Solving/BOJ(백준)

[BOJ]백준 13424번: 비밀 모임(C++)/Dijkstra

이진2 2021. 7. 9. 00:49

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

 

13424번: 비밀 모임

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

www.acmicpc.net

또익스트라 구현 코드를 조금 바꿔보았다

이 문제는 입력받은 정점 리스트에 대해 최단거리 합이 가장 작은 정점을 구하는 기본기본 문제였다

 

보편적인 코테 뚫으려면 구현+문자열 위주로 연습해야 되는데 ..... 카카오 코테 준비하려면 다양하게도 풀어야되고 .......... 어떻게 해야될지 정말 ~~~~ 모르겠다 ~~

이제 기본문제 말고 응용문제로 넘어가야지... ㅠㅠ 달빛여우한테 혼났다........

#include <cstdio>
#include <vector>
#include <queue>
#define pii pair<int,int>
#define INF 987654321
using namespace std;

vector<vector<pii>> g;
vector<vector<int>> dist;
int tc,n,m,k;

void dijkstra(int s) {
	dist[s] = vector<int>(n + 1, INF);
	priority_queue<pii,vector<pii>,greater<>> pq;

	dist[s][s] = 0;
	pq.push(make_pair(0, s));

	while (!pq.empty()) {
		int cur = pq.top().second; 
		int cost = pq.top().first; pq.pop();
		if (cost > dist[s][cur])continue;

		for (auto x : g[cur]) 
		if(dist[s][x.second]>cost+x.first){
			dist[s][x.second] = x.first + cost;
			pq.push(make_pair(dist[s][x.second], x.second));
		}
	}
}

int main() {
	scanf("%d", &tc);

	while (tc--) {
		scanf("%d%d", &n, &m);
		g = vector<vector<pii>>(n + 1);
		dist = vector<vector<int>>(n + 1);

		for (int i = 0,a,b,c; i < m; i++) {
			scanf("%d%d%d", &a, &b, &c);
			g[a].push_back(make_pair(c, b));
			g[b].push_back(make_pair(c, a));
		}

		scanf("%d", &k);
		vector<int> f(k);
		for (int i = 0; i < k; i++) {
			scanf("%d", &f[i]);
			dijkstra(f[i]);
		}

		int min = INF,ans;
		for (int i = 1; i <= n; i++) {
			int sum = 0;
			for (int j = 1; j <= n; j++)
				if(!dist[j].empty()) sum += dist[j][i];
			if (sum < min) {
				min = sum;
				ans = i;
			}
		}
		printf("%d\n", ans);
	}

	return 0;
}