록키의 No Pain, No Gain

[BOJ] 1238 파티 본문

알고리즘

[BOJ] 1238 파티

Rohki 2020. 5. 22. 00:47
반응형

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

 

1238번: 파티

문제 N개의 숫자로 구분된 각각의 마을에 한 명의 학생이 살고 있다. 어느 날 이 N명의 학생이 X (1 ≤ X ≤ N)번 마을에 모여서 파티를 벌이기로 했다. 이 마을 사이에는 총 M개의 단방향 도로들이

www.acmicpc.net

플로이드 워셜이나

다익스트라 알고리즘을 사용하면 되는 문제

중요한건 다익스트라를 거꾸로 오는 경로로 생각했어야 했다.

그렇지 않으면 시간초과난다!!!!!

 

#include <iostream>
#include <queue>
#include <algorithm>
#include <cstring>
#include <utility>
#define INF 1000000
using namespace std;

int N, M, X;
int adj[1001][1001];
priority_queue<pair<int,int>> dist;
int result[1001];
bool visited[1001];
int main() {
	cin >> N >> M >> X;
	
	for (int i = 1; i <= N; i++) for (int j = 1; j <= N; j++) adj[i][j] = INF;
	for (int i = 1; i <= N; i++) adj[i][i] = 0;

	int x, y, t;
	for (int i = 0; i < M; i++) {
		cin >> x >> y >> t;
		adj[x][y] = t;
	}

	//X에서 가는 것
	for (int i = 1; i <= N; i++) if( i != X) dist.push({ -adj[X][i], i });
	visited[X] = true;

	for (int i = 1; i <= N - 1; i++) {
		int val = 0;
		int idx = 0;
		while (!dist.empty()) {
			val = -dist.top().first;
			idx = dist.top().second;
			dist.pop();
			if (!visited[idx]) break;
		}

		
		result[idx] += val;
		visited[idx] = true;

		for (int j = 1;  j <= N; j++) {
			if (visited[j]) continue;
			dist.push({-(val + adj[idx][j]),j});
		}
	}

	//X까지 가는 것
	memset(visited, false, sizeof(visited));
	while (!dist.empty()) dist.pop();

	for (int i = 1; i <= N; i++) if (i != X) dist.push({ -adj[i][X], i });
	visited[X] = true;

	for (int i = 1; i <= N - 1; i++) {
		int val = 0;
		int idx = 0;
		while (!dist.empty()) {
			val = -dist.top().first;
			idx = dist.top().second;
			dist.pop();
			if (!visited[idx]) break;
		}


		result[idx] += val;
		visited[idx] = true;

		for (int j = 1; j <= N; j++) {
			if (visited[j]) continue;
			dist.push({ -(val + adj[j][idx]),j });
		}
	}

	int answer = 0;
	for (int i = 1; i <= N; i++) answer = max(answer, result[i]);

	cout << answer;
}
반응형

'알고리즘' 카테고리의 다른 글

[BOJ] 1238 파티  (0) 2020.05.22
[BOJ] 16235번 나무 재테크  (0) 2020.05.21
[SWEA] 점심 식사시간  (0) 2020.05.13
[BOJ] 17471번 게리멘더링  (0) 2020.04.28
[BOJ] 17822번 원판 돌리기  (0) 2020.04.28
Comments