오늘의 알고리즘

[C++] 백준 11404 플로이드

하늘하늘 . 2022. 10. 14. 21:22
#include <iostream>
#include <vector>
#include <queue>
 
int n = 0;
int m = 0;
int visit[101] = {};
std::vector<std::pair<int, int>> vec[101] = {};
 
void Dijkstra(int iStart)
{
	std::priority_queue < std::pair<int, int>, 
		std::vector<std::pair<int, int>>, 
		std::greater<std::pair<int, int>>> pri_que = {};
	pri_que.push({0, iStart});
	visit[iStart] = 0;
 
	while (!pri_que.empty())
	{
		int iCost = pri_que.top().first;
		int iNow = pri_que.top().second;
		pri_que.pop();
 
		for (int i = 0; i < vec[iNow].size(); ++i)
		{
			int iNextCost = vec[iNow][i].second;
			int iNext = vec[iNow][i].first;
 
			if (visit[iNext] > iNextCost + iCost)
			{
				visit[iNext] = iNextCost + iCost;
				pri_que.push({iNextCost + iCost, iNext});
			}
		}
	}
}
 
int main()
{
	std::ios::sync_with_stdio(false);
	std::cin.tie(NULL);
	std::cin >> n >> m;
 
	for (int i = 0; i < m; ++i)
	{
		int a = 0;
		int b = 0;
		int c = 0;
 
		std::cin >> a >> b >> c;
 
		vec[a].push_back({b, c});
	}
 
	for (int i = 1; i <= n; ++i)
	{
		for (int j = 1; j <= n; ++j)
		{
			visit[j] = 2147483647;
		}
 
		Dijkstra(i);
 
		for (int j = 1; j <= n; ++j)
		{
			if (visit[j] == 2147483647)
			{
				std::cout << "0 ";
			}
 
			else
			{
				std::cout << visit[j] << " ";
			}
		}
 
		std::cout << "\n";
	}
 
	return 0;
}
저는 보자마자 다익스트라자다!
하고 한점에서 가는 비용을 찾았습니다.
근데... 플로이드 와샬 알고리즘을 사용해서 하는 게 더 빠르더라구요...
한 점에서 찾는 건 다익스트라자
여러 점에서 여러 점은 플로이드 와샬! 알고리즘을 생각하시면 될 것 같습니다.
물론 플로이드 와샬은 3중포문이라 느릴 줄 알았는데 100개가 최대라서 플로이드 와샬이 좀 더 빨랐습니다.
여기서 플로이드 와샬은 i -> j -> k 일 때 i -> k 의 값을 정해주는 것입니다.