문제풀이/백준oj
[백준OJ] 13424번 비밀 모임
Hyeon-Uk
2021. 7. 20. 11:06
반응형
https://www.acmicpc.net/problem/13424
13424번: 비밀 모임
입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에 테스트 케이스의 개수를 나타내는 자연수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 방
www.acmicpc.net
-풀이-
플로이드-와샬 알고리즘을 이용하여 모든방에서 모든방까지의 최단거리를 구해주었다.
그런뒤, 친구들이 있는 방의 위치를 입력받았다.
그런뒤 1번방~N번방까지 각각의 방을 기준으로 모든 친구들까지의 거리를 플로이드-와샬 알고리즘을 이용하여 구한 최단거리를 이용하여 가장 짧은 거리들의 합을 구해준 뒤, 가장 작은 거리와 그 방을 갱신시켜주면 된다.
-시간복잡도-
플로이드-와샬 알고리즘의 시간복잡도는 O(N3)이 된다.
각 방을 기준으로 모든 친구들까지의 거리의 합을 구해서 최소가 되는 방을 구하는 알고리즘은 O(NK)가 된다.
따라서 시간복잡도는 O(N3)가 된다.
-코드-
#include <algorithm>
#include<iostream>
#include<vector>
#define INF 987654321
using namespace std;
long long maze[101][101]={0};
int N,M,K,T;
int main(){
cin.tie(NULL); cout.tie(NULL); ios_base::sync_with_stdio(false);
cin>>T;
while(T--){
vector<int> friends;
cin>>N>>M;
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
maze[i][j]=INF;
}
}
for(int i=0;i<M;i++){
int a,b,c;
cin>>a>>b>>c;
maze[a][b]=c;
maze[b][a]=c;
}
for(int k=1;k<=N;k++){
for(int i=1;i<=N;i++){
for(int j=1;j<=N;j++){
if(i==j||j==k||i==k) continue;
maze[i][j]=min(maze[i][j],maze[i][k]+maze[k][j]);
}
}
}
cin>>K;
for(int i=0;i<K;i++){
int data;
cin>>data;
friends.push_back(data);
}
long long min_dist=INF;
int room=-1;
for(int i=1;i<=N;i++){
long long sum=0;
for(int j=0;j<K;j++){
if(maze[i][friends[j]]!=INF){
sum+=maze[i][friends[j]];
}
}
if(min_dist>sum){
min_dist=sum;
room=i;
}
}
cout<<room<<"\n";
}
}
반응형