-
반응형
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"; } }
반응형'문제풀이 > 백준oj' 카테고리의 다른 글
[백준OJ] 10844번 쉬운 계단 수 (0) 2021.07.21 [백준OJ] 4096번 팰린드로미터 (0) 2021.07.21 [백준OJ] 2696번 중앙값 구하기 (0) 2021.07.20 [백준OJ] 1240번 노드사이의 거리 (0) 2021.07.20 [백준OJ] 9933번 민균이의 비밀번호 (0) 2021.07.20 댓글