본문 바로가기
백준/그래프

백준 1238 c++ - [PlusUltraCode]

by PlusUltraCode 2024. 2. 20.

 

[필자 사고]

 

문제를 분석해 보면 X라는 지점에 간 거리와
X에서 부터 본래의 자기 집으로 간 거리의 합이 가장 긴 값을 구하는 문제이다.

 

다익스트라 알고리즘을 사용하면 쉽게 풀 수 있는 문제이다.

1. 각 지점에서 다익스트라 알고리즘을 사용하고 X까지의 거리를 임의이 배열에 저장해 놓는다.

2. 다음으로 X에서 다익스트라 알고리즘을 사용하여 임의의 배열에 더하여 저장해 놓는다.

3. 임의이 배열에서 가장 큰 값이 정답이다.

 

[소스 코드]

#include <iostream>
#include <vector>
#include <queue>
#include<climits>
#include <algorithm>
using namespace std;

int N, M, X;

typedef pair<int, int> Node;
vector<vector<Node>> Arr;
vector<bool> visited;
vector<int> pathLoad;
vector<int> pathLoad2;
priority_queue<Node, vector<Node>, greater<Node>> pq;
void Input() {
	cin >> N >> M >> X;
	Arr.resize(N + 1);
	visited.resize(N + 1, false);
	pathLoad2.resize(N + 1, 0);
	pathLoad.resize(N + 1, INT_MAX);
	for (int i = 0; i < M; i++) {
		int start, end, weight;
		cin >> start >> end >> weight;
		Arr[start].push_back({ weight,end });

	}

}

void Init() {
	pathLoad.clear();
	visited.clear();
	pathLoad.resize(N + 1, INT_MAX);
	visited.resize(N + 1, false);

}

void Solve() {

	for (int i = 1; i <= N; i++) {

		if (i == X)continue;

		pq.push({ 0,i });
		pathLoad[i] = 0;
		while (!pq.empty()) {
			int nowIdx = pq.top().second;
			pq.pop();
			if (visited[nowIdx] == true)continue;
			visited[nowIdx] = true;
			for (Node nextNode : Arr[nowIdx]) {
				int nextIdx = nextNode.second;
				int nextWeight = nextNode.first;
				if (visited[nextIdx] == false &&
					pathLoad[nextIdx] > pathLoad[nowIdx] + nextWeight) {
					pathLoad[nextIdx] = pathLoad[nowIdx] + nextWeight;
					pq.push({ pathLoad[nextIdx],nextIdx });
				}
			}
		}
		pathLoad2[i] = pathLoad[X];

		Init();
	}


	pq.push({ 0,X });
	pathLoad[X] = 0;
	while (!pq.empty()) {
		int nowIdx = pq.top().second;
		pq.pop();
		if (visited[nowIdx] == true)continue;
		visited[nowIdx] = true;
		for (Node nextNode : Arr[nowIdx]) {
			int nextIdx = nextNode.second;
			int nextWeight = nextNode.first;
			if (visited[nextIdx] == false &&
				pathLoad[nextIdx] > pathLoad[nowIdx] + nextWeight) {
				pathLoad[nextIdx] = pathLoad[nowIdx] + nextWeight;
				pq.push({ pathLoad[nextIdx],nextIdx });
			}
		}
	}


	for (int i = 0; i <= N; i++) {
		if (pathLoad[i] == INT_MAX || pathLoad2[i] == INT_MAX) {
			continue;
		}
		pathLoad2[i] += pathLoad[i];

	}
	cout << *max_element(pathLoad2.begin(), pathLoad2.end());


}

int main(void) {
	Input();
	Solve();
}

 

'백준 > 그래프' 카테고리의 다른 글

백준 13549 c++ -[PlusUltraCode]  (1) 2024.02.26
백준 2583 c++ -[PlusUltraCode]  (0) 2024.02.23
백준 2468 c++ - [PlusUltraCode]  (0) 2024.02.23
14502 백준 c++ -[PlusUltraCode]  (0) 2024.02.23
백준 1865 c++ -[PlusUltraCode]  (0) 2024.02.22