본문 바로가기
Python/알고리즘문제

[백준 1753] 최단경로

by 붕어사랑 티스토리 2021. 3. 11.
반응형

대표적인 다익스트라 알고리즘. c++에서는 우선순위 큐를 사용하고 파이썬에서는 heapq를 사용해주자.

 

이문제가 거지같은점은 cout으로 하면 시간초과나고 printf로 출력하면 통과한다는 것이다.

 

파이썬은 그냥 스무스하게 통과하는데....

 

 

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>

using namespace std;
vector<pair<int, int>> adj[20001];
int V, E, s;
#define INF 987654321
bool visit[20001];
void dikjstra(int start) {

	memset(visit, 0, sizeof(visit));
	int dist[20001];
	for (int i = 1; i <= V; i++)dist[i] = INF;
	dist[start] = 0;
	std::priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
	pq.push({ dist[start],start });

	while (!pq.empty())
	{
		int cost = pq.top().first;
		int now = pq.top().second;
		pq.pop();
		if (visit[now])continue;
		if (cost > dist[now])continue;
		for (pair<int, int> nextnode : adj[now]) {
			int next = nextnode.first;
			int cost = nextnode.second;
			if (dist[next] > dist[now] + cost) {
				dist[next] = dist[now] + cost;
				if (!visit[next])pq.push({ dist[next],next });
			}
		}
		visit[now] = true;
	}
	for (int i = 1; i <= V; i++) {
		if (dist[i] == INF)printf("INF\n");
		else printf("%d\n", dist[i]);
	}
}



int main() {

	cin >> V >> E>>s;
	for (int i = 1; i <= E; i++) {
		int u, v, w;
		cin >> u >> v >> w;
		adj[u].push_back({ v, w });
	}

	dikjstra(s);


	return 0;
}

 

import sys
import heapq
V, E = map(int,sys.stdin.readline().split())
K = int(input())
edge = [[] for _ in range(V+1)]
for _ in range(E):
    u, v, w = map(int,sys.stdin.readline().split())
    edge[u].append((v,w))


visit = set()
def dikjstra(start):
    heap = []
    dist = [987654321]*(V+1)
    dist[start] = 0
    heap.append((dist[start],start))
    while heap:
        cost, now = list(heapq.heappop(heap))
        if now in visit:
            continue
        if cost > dist[now]:
            continue
        visit.add(now)
        for nextnode in edge[now]:
            if dist[now] + nextnode[1] < dist[nextnode[0]]:
                dist[nextnode[0]]=dist[now]+nextnode[1]
                heapq.heappush(heap,(dist[nextnode[0]],nextnode[0]))

    for i in range(1,V+1):
        if dist[i] == 987654321:
            print("INF")
        else:
            print(dist[i])


dikjstra(K)
반응형

'Python > 알고리즘문제' 카테고리의 다른 글

[프로그래머스][해시] 완주하지 못한 선수  (0) 2021.03.12
[백준 1463] 1로 만들기  (0) 2021.03.11
[백준 2606] 바이러스  (0) 2021.03.11
[백준 2805] 나무자르기  (0) 2021.03.11
[백준 15649] N과 M (1)  (0) 2021.03.11

댓글