일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- BFS
- LazyPropagation
- boj
- 그리디
- 누적합
- 투포인터
- 에라토스테네스의 체
- 펜윅트리
- 브루트포스
- 정렬
- 삼분탐색
- 이진탐색
- 수학
- 세그먼트트리
- 크루스칼
- 위상정렬
- DisjointSet
- 백준
- 플로이드와샬
- DP
- lca
- 구현
- 비트마스크
- 좌표압축
- 이분탐색
- lis
- MST
- dfs
- 이분매칭
- 다익스트라
Archives
- Today
- Total
lastknight00
[백준]비밀 모임(13424) 본문
문제 링크 : [백준]비밀 모임(13424)
문제 설명
N개의 방이 주어지고, M개의 양방향 간선이 주어집니다.
이때, 정해진 K개의 방에서 출발하여 특정 방에서 모이려고 할 때, 모이기 위해 이동하는 거리의 합이 최소가 되는 방 번호를 구하세요.
입력
T(테스트 케이스 수)
N(방의 갯수, 1 <= N <= 100)
M(간선의 수, 1 <= M <= N * (N - 1) / 2)
Si Ei Ci(출발, 도착, 비용, 1 <= Ci <= 1,000)
K(출발할 방의 갯수, 1 <= N)
Di(출발 할 방의 번호)
2
6 7
1 2 4
1 3 1
1 5 2
2 3 2
3 4 3
4 5 2
6 5 1
2
3 5
4 5
1 2 2
1 3 1
2 3 2
2 4 3
3 4 6
2
3 4
출력
1
2
카테고리
#플로이드와샬
시간 복잡도 상한
O(N3)
해결 방법
- 답을 구하기 위해서는 출발할 모든 방에서 출발하여 모든 방에 도착하는 경우를 알아야 그 중 최소값을 구할 수 있습니다.
- 플로이드와샬을 통해 N3에 모든 방 사이에 최소비용을 구할 수 있습니다.
- 주어진 모든 출발지에서 모든 방에 도착하는 비용들의 합을 구하면서 최소값을 구하면 됩니다.
시간복잡도
O(N3)
코드
#include<cstdio>
#include<string.h>
#include<algorithm>
using namespace std;
int t,n,m,l,k,d[101][101],i,j,e[100],s,p;
int main(){
scanf("%d",&t);
while(t--){
for(i=1;i<101;i++)for(j=1;j<101;j++)d[i][j]=i!=j?999999:0;
s=999999;
scanf("%d%d",&n,&m);
while(m--){
scanf("%d%d%d",&i,&j,&k);
d[i][j]=d[j][i]=k;
}
scanf("%d",&l);
for(i=0;i<l;i++)scanf("%d",e+i);
for(k=1;k<=n;k++)for(i=1;i<=n;i++)for(j=1;j<=n;j++)d[i][j]=min(d[i][j],d[i][k]+d[k][j]);
for(i=1;i<=n;i++){
for(k=j=0;j<l;j++)k+=d[e[j]][i];
if(s>k)s=k,p=i;
}
printf("%d\n",p);
}
}
'PS' 카테고리의 다른 글
[백준]주유소(13308) (0) | 2020.07.18 |
---|---|
[백준]강의실 배정(11000) (0) | 2020.07.18 |
[백준]숫자구슬(2613) (0) | 2020.07.15 |
[백준]피자판매(2632) (0) | 2020.07.15 |
[백준]배열에서 이동(1981) (0) | 2020.07.14 |
Comments