알고리즘

이것이 코딩테스트다 - 9) 최단 경로 찾기

dodop 2021. 1. 27. 21:59

 

 

 

 

다이나믹프로그래밍에 이어서 눈물만 나오는...^^

 

꼭 다시풀자 😂

 

 

 

9.1) 미래 도시

#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#define INF 1e9


using namespace std;


int n, m, x, k;
int graph[101][101];


int main() {

	cin >> n >> m;

	for (int i = 0; i < 101; i++)
	{
		fill(graph[i], graph[i] + 101, INF);
	}
	for (int i = 1; i < n + 1; i++) {
		for (int j = 1; j < n + 1; j++) {
			if (i == j) graph[i][j] = 0;
		}
	}
	for (int i = 1; i <= m; i++) {
		int a, b;
		cin >> a >> b;
		graph[a][b] = 1;
		graph[b][a] = 1;
	}

	cin >> x >> k;

	for (int k = 1; k < n + 1; k++)
	{
		for (int a = 1; a < n + 1; a++)
		{
			for (int b = 1; b < n + 1; b++) {
				graph[a][b] = min(graph[a][b], graph[a][k] + graph[k][b]);
			}
		}
	}

	int distance = graph[1][k] + graph[k][x];

	if (distance >= INF) cout << "-1";
	else cout << distance << endl;

	return 0;
}

 

 

 

9.2) 전보

#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#define INF 1e9


using namespace std;

int n, m, start;
vector <pair <int, int>> graph[30001];

int d[30001];

void dijkstra(int start) {

	priority_queue <pair<int, int>> pq;
	pq.push({ 0,start });
	d[start] = 0;
	while (!pq.empty()) {
		int dist = -pq.top().first;
		int now = pq.top().second;

		pq.pop();

		if (d[now] < dist)continue;
		for (int i = 0; i < graph[now].size(); i++)
		{
			int cost = dist + graph[now][i].second;
			if (cost < d[graph[now][i].first])
			{
				d[graph[now][i].first] = cost;
				pq.push(make_pair(-cost, graph[now][i].first));
			}
		}
	}
}

int main() {

	cin >> n >> m >> start;
	for (int i = 0; i < m; i++) {
		int x, y, z;
		cin >> x >> y >> z;
		graph[x].push_back({ y, z });
	}

	fill(d, d + 30001, INF);


	dijkstra(start);

	int count = 0;

	int maxDistance = 0;

	for (int i = 1; i <= n; i++)
	{
		if (d[i] != INF)
		{
			count += 1;
			maxDistance = max(maxDistance, d[i]);
		}
	}

	cout << count - 1 << ' ' << maxDistance << endl;



	return 0;
}