해법 : dijkstra
그런데 시간복잡도 문제 때문에 heap dijkstra로 작성해야 한다.
편이를 위해서 STL을 사용하였다.
dijstra 설명 : [알고리즘] Dijkstra (tistory.com)
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>
#define INF 99999999
using namespace std;
int n,e;
int s;
struct tuple2 {
int node;
int val;
};
struct pq_tuple {
int idx;
int dist;
bool operator < (const pq_tuple &node) const {
return dist>node.dist;
}
};
vector <tuple2> A[20005];
long long dist[20005];
int visited[20005];
priority_queue <pq_tuple> pq;
void dijkstra() {
dist[s]=0;
pq_tuple srg;
int i,j;
int _min,min_idx;
srg.idx=s;
srg.dist=0;
pq.push(srg);
while(!pq.empty()) {
min_idx=pq.top().idx;
_min=pq.top().dist;
if(visited[pq.top().idx]==1) {
pq.pop();
continue;
}
visited[pq.top().idx]=1;
pq.pop();
for(i=0;i<A[min_idx].size();i++) {
if(visited[A[min_idx][i].node]==0 && dist[A[min_idx][i].node]>_min+A[min_idx][i].val) {
dist[A[min_idx][i].node]=_min+A[min_idx][i].val;
srg.idx=A[min_idx][i].node;
srg.dist=_min+A[min_idx][i].val;
pq.push(srg);
}
}
}
for(i=1;i<=n;i++) {
if(dist[i]!=INF) {
printf("%lld\n",dist[i]);
} else {
printf("INF\n");
}
}
}
int main()
{
//freopen("input.txt","r",stdin);
scanf("%d %d",&n,&e);
scanf("%d",&s);
int i,a;
tuple2 srg;
for(i=0;i<e;i++) {
scanf("%d %d %d",&a,&srg.node,&srg.val);
A[a].push_back(srg);
}
for(i=1;i<=n;i++) dist[i]=INF;
dijkstra();
return 0;
}
'1p1d' 카테고리의 다른 글
[Day 4] 백준 7569 : 토마토 (0) | 2021.01.24 |
---|---|
[Day 3] 백준 2589 : 보물섬 (0) | 2021.01.24 |
Schedule (0) | 2021.01.23 |
[Day 1] 백준 1937 : 욕심쟁이 판다 (0) | 2021.01.22 |
[Day 2] 백준 1931 : 회의실 배정 (0) | 2021.01.22 |