일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- dfs
- 비트마스크
- 누적합
- MST
- DisjointSet
- 플로이드와샬
- 그리디
- 다익스트라
- lis
- 이분매칭
- 크루스칼
- DP
- 이분탐색
- 삼분탐색
- 세그먼트트리
- 에라토스테네스의 체
- 이진탐색
- 정렬
- 브루트포스
- LazyPropagation
- 위상정렬
- 구현
- 좌표압축
- 수학
- 투포인터
- 펜윅트리
- BFS
- 백준
- boj
- lca
Archives
- Today
- Total
lastknight00
[백준] 택배(1719) 본문
문제 링크 : [백준] 택배(1719)
문제 설명
양방향 그래프가 주어지면, 각각의 노드에서 다른 노드로 최단거리로 이동하기 위해서 처음으로 이동해야 하는 노드를 구하여, N*N 행렬로 표시합니다.
입력
N(노드 수, 1<=N<=200)
M(간선 수, 1<=M<=10,000)
Di(M개가 나옴,1<=Di<=1,000)
6 10
1 2 2
1 3 1
2 4 5
2 5 3
2 6 7
3 4 4
3 5 6
3 6 7
4 6 4
5 6 2
출력
- 2 3 3 2 2
1 - 1 4 5 5
1 1 - 4 5 6
3 2 3 - 6 6
2 2 3 6 - 6
5 5 3 4 5 -
카테고리
#다익스트라
시간 복잡도 상한
O(N*M) 혹은 O(N * M * logM)까지 가능합니다.
해결 방법
- 최단거리를 구하는 방법은 다익스트라나 플로이드 와샬을 사용할 수 있습니다.
- 최초로 이동하는 노드를 저장해야하기 때문에 플로이드 와샬보다는 다익스트라를 사용하는 것이 좋아 보입니다.
- 각 노드를 시작점으로 다익스트라를 돌리게 되면 O(N*MlogM)정도가 걸리므로, 200 * 10,000 * 14 = 28,000,000 정도가 걸리므로 시간은 충분합니다.
- 다익스트라에서 Priority Queue에 넣을 때, 일반적으로, 도착점과 비용을 넣지만, 여기서는 최초 이동 노드도 같이 저장합니다.
- 실제 비용은 중요하지 않으므로, 비용을 저장하지는 않고, 처음 노드를 방문 할 때, 최초 방문 노드만 저장합니다.
5-1. Priority Queue의 특성 상, 특정 노드에 한번 방문한 이후에, 다시 그 노드를 방문하는 엣지가 Priority Queue에서 나온다고 하여도, 이전에 방문했던 비용보다 항상 같거나 크므로, 최소 비용이 변경되지 않음을 알 수 있습니다.
코드
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
typedef pair<int,int>P;
int n,m,d[201][201],a,b,c,i;
priority_queue<pair<int,P>,vector<pair<int,P>>,greater<pair<int,P>>>q;
vector<P>v[201];
int main(){
scanf("%d%d",&n,&m);
while(m--){
scanf("%d%d%d",&a,&b,&c);
v[a].push_back({b,c});
v[b].push_back({a,c});
}
for(i=1;i<=n;i++){
while(!q.empty())q.pop();
for(P x:v[i])q.push({x.second,{x.first,x.first}});
while(!q.empty()){
pair<int,P> x=q.top();q.pop();
if(d[i][x.second.first])continue;
d[i][x.second.first]=x.second.second;
for(P N:v[x.second.first]){
if(d[i][N.first])continue;
q.push({x.first+N.second,{N.first,x.second.second}});
}
}
}
for(a=1;a<=n;a++){
for(b=1;b<=n;b++){
if(a==b)printf("- ");
else printf("%d ",d[a][b]);
}
printf("\n");
}
}
'PS' 카테고리의 다른 글
[백준] 로봇 프로젝트(3649) (0) | 2020.05.26 |
---|---|
[백준] 개똥벌레(3020) (0) | 2020.05.26 |
[백준] 가스관(2931) (0) | 2020.05.26 |
[백준] 방청소(9938) (0) | 2020.05.26 |
[백준] 라운드 로빈 스케줄러(12016) (0) | 2020.05.26 |
Comments