그러기 위해선 모든 정점 간의 최단 거리를 구해야하므로, 플로이드 와샬 알고리즘을 썼다.
이제 모든 정점 간의 최단 거리는 구해졌고, (한 정점 K 에서 미팅을 하는 사람의 은하 i)들의 각 비용의 합이 최소가 되는 순간 미팅 장소 은하 K를 갱신했다.
#include <bits/stdc++.h> using namespace std; #define INF 987654321 int main(){ int i, j, k, T; scanf("%d", &T); while(T--){ int n, p, q; scanf("%d %d %d", &n, &p, &q); int members[100]={}, astro[101][101]; for(i=0; i<p; ++i){ for(j=0; j<p; ++j){ if(i == j) astro[i][j] = 0; else astro[i][j] = INF; } } for(i=0; i<n; ++i) scanf("%d", &members[i]); for(i=0; i<q; ++i){ int u, v, d; scanf("%d %d %d", &u, &v, &d); astro[u-1][v-1] = astro[v-1][u-1] = d; } for(k=0; k<p; ++k){ for(i=0; i<p; ++i){ for(j=0; j<p; ++j){ if(astro[i][k]+astro[k][j] < astro[i][j]) astro[i][j] = astro[i][k]+astro[k][j]; } } } int meetingPoint=0, minCost=987654322; for(i=0; i<p; ++i){ int cost = 0; for(j=0; j<n; ++j){ if(astro[members[j]-1][i] == INF){ cost = INF; break; } cost += astro[members[j]-1][i] * astro[members[j]-1][i]; } if(minCost > cost){ minCost = cost; meetingPoint = i+1; } } printf("%d %d\n", meetingPoint, minCost); } return 0; }
댓글 없음:
댓글 쓰기