BOJ 1238 파티

2020. 11. 5. 15:15·알고리즘/BOJ

www.acmicpc.net/problem/1238

 

1238번: 파티

첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X가 공백으로 구분되어 입력된다. 두 번째 줄부터 M+1번째 줄까지 i번째 도로의 시작점, 끝점, 그리고 이 도로를 지나는데 필요한 소요시간 Ti가 들어

www.acmicpc.net

 

다익스트라 응용문제로, 단방향 그래프의 방향을 바꿔서 다익스트라를 돌리면

모든 정점에서 한 정점으로 가는 거리를 구할 수 있다.

 

따라서 파티장 x가 주어지면

a에서 b로 가는 그래프 외에

b에서 a로 가는 그래프도 입력을 받아주고

각각에 대해서 다익스트라를 사용한 뒤에 두 배열의 합 중에서 가장 큰 값이 정답이 된다.

 

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

const int INF = 1e9;
priority_queue<pair<int, int>> pq;
vector<pair<int, int>> ar[1001], ar2[1001];
int n, m, x, a, b, c;

vector<int> dijkstra(int s, vector<pair<int, int>> ar[]) {
	vector<int> d(n, INF);
	d[s] = 0;
	pq.push({ 0,s });

	while (!pq.empty()) {
		int cur = pq.top().second;
		int cost = -pq.top().first;
		pq.pop();
		if (d[cur] < cost) continue;
		for (auto i : ar[cur]) {
			int nc = cost + i.second;
			if (nc < d[i.first]) {
				d[i.first] = nc;
				pq.push({ -nc,i.first });
			}
		}
	}

	return d;
}

int main() {
	ios::sync_with_stdio(false); cin.tie(0);

	cin >> n >> m >> x;
	for (int i = 0; i < m; ++i) {
		cin >> a >> b >> c;
		ar[b - 1].push_back({ a - 1,c });
		ar2[a - 1].push_back({ b - 1,c });
	}

	vector<int> back = dijkstra(x - 1, ar);
	vector<int> go = dijkstra(x - 1, ar2);
	vector<int> ans;

	for (int i = 0; i < n; ++i) {
		//cout << back[i] << ' ' << go[i] << '\n';
		ans.push_back(back[i] + go[i]);
	}

	cout << *max_element(ans.begin(), ans.end()) << endl;

	return 0;
}

 

방향이 바뀔 경우 모든 정점에서 한 정점으로 가는 거리가 나온다는 특성을 알고 있었다면

쉽게 풀리는 문제였다.

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

BOJ 2573 빙산  (0) 2020.11.07
BOJ 4485 녹색 옷 입은 애가 젤다지?  (0) 2020.11.06
BOJ 9370 미확인 도착지  (0) 2020.11.05
BOJ 2357 최솟값과 최댓값  (0) 2020.11.04
BOJ 1261 알고스팟  (0) 2020.11.04
'알고리즘/BOJ' 카테고리의 다른 글
  • BOJ 2573 빙산
  • BOJ 4485 녹색 옷 입은 애가 젤다지?
  • BOJ 9370 미확인 도착지
  • BOJ 2357 최솟값과 최댓값
khyu2
khyu2
  • khyu2
    dev log
    khyu2
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 알고리즘
        • BOJ
        • Programmers
        • Algorithm
        • SWEA
      • 개발
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    냅색
    MST
    시뮬레이션
    dp
    분할 정복
    트리
    구현
    행렬 제곱
    GREEDY
    피보나치 수
    소수
    완전 탐색
    유니온 파인드
    BOJ
    알고리즘
    dfs
    큐
    코딩테스트 연습
    우선순위 큐
    이분 탐색
    SWEA
    크루스칼
    다익스트라
    완전탐색
    팰린드롬
    프로그래머스
    BFS
    조합
    이분탐색
    피사노 주기
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
khyu2
BOJ 1238 파티
상단으로

티스토리툴바