Notice
Recent Posts
Recent Comments
Link
«   2026/02   »
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
Archives
Today
Total
관리 메뉴

hwooo

BOJ (C/C++) 11404번: 플로이드 본문

Study/Algorithm

BOJ (C/C++) 11404번: 플로이드

hwooo 2022. 11. 19. 03:33

https://www.acmicpc.net/problem/11404

 

11404번: 플로이드

첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가

www.acmicpc.net


풀이

문제 이름에서부터 알 수 있듯이 플로이드-와샬을 쓰는 문제다.
문제의 "시작 도시와 도착 도시를 연결하는 노선은 하나가 아닐 수 있다." 는 문구가 있으므로 값을 입력 받는 부분에서도 최솟값을 입력 받아야 한다.
다익스트라로도 풀어봤지만 코드 길이와 시간 면에서 플로이드-와샬의 성능이 더 좋다.

코드 1 - 플로이드

#include <stdio.h>
#include <algorithm>
#include <limits.h>
using namespace std;

#define INF 100000000
int Min(int a, int b) { if (a < b) return a; return b; }
int main() {
	int N, M, a, b, c;
	int D[101][101];

	// init
	fill(D[0], D[101], INF);
	for (int i = 1; i <= 100; i++) D[i][i] = 0;

	// input
	scanf("%d %d", &N, &M);
	for (int i = 0; i < M; i++) {
		scanf("%d %d %d", &a, &b, &c);
		D[a][b] = Min(c, D[a][b]);
	}

	// floyd - warshall
	for (int k = 1; k <= N; k++) {
		for (int i = 1; i <= N; i++) {
			for (int j = 1; j <= N; j++) {
				D[i][j] = Min(D[i][j], D[i][k] + D[k][j]);
			}
		}
	}

	// print
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= N; j++) {
			if (D[i][j] == INF) D[i][j] = 0;
			printf("%d ", D[i][j]);
		}
		printf("\n");
	}
	return 0;
}

코드 2 - 다익스트라

#include <stdio.h>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

#define MAX 100000000

vector <pair<int, int>> V[101];
int Distance[101];

 void Dijkstra(int start, int N) {
	priority_queue <pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
	int now, dis, next;
	int D[101];

	fill(D, D + N, MAX);
	D[start] = 0;
	pq.push({ 0,start });

	while (!pq.empty()) {
		now = pq.top().second, dis = pq.top().first;
		pq.pop();
		if (D[now] < dis) continue;

		for (int i = 0; i < V[now].size(); i++) {
			next = V[now][i].first, dis = V[now][i].second;
			if (D[next] > D[now] + dis) {
				D[next] = D[now] + dis;
				pq.push({ D[next],next });
			}
		}
	}
    
    	//print
	for (int i = 1; i < N; i++) {
		if (D[i] == MAX) D[i] = 0;
		printf("%d ", D[i]);
	}
	printf("\n");
}

int main() {
	int N, M;
	int a, b, c;
	scanf("%d %d", &N, &M);
	for (int i = 0; i < M; i++) {
		scanf("%d %d %d", &a, &b, &c);
		V[a].push_back({ b,c });
	}
	for (int i = 1; i <= N; i++) Dijkstra(i, N+1);
	return 0;
}

'Study > Algorithm' 카테고리의 다른 글

BOJ (C/C++) 2441번: 별 찍기 - 4  (0) 2022.11.19
BOJ (C/C++) 2558번: A+B - 2  (0) 2022.11.19
BOJ (C/C++) 1504번: 특정한 최단 경로  (0) 2022.11.19
BOJ (C/C++) 1238번: 파티  (0) 2022.11.19
BOJ (C/C++) 1916번: 최소비용 구하기  (0) 2022.11.18