반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
Tags
- 경제기사 읽기
- 경제적 자유를 위한 5가지 공부법
- 원금리스크
- 업무지구별
- 제로금리정책
- 역행자
- 부동산기사읽기
- 자발적 실업
- 매일경제
- 구해줘월부
- 경제 기사읽기
- 황농문 서울대교수
- 정체성 만들기
- 한국직업개발원
- 평균급여액
- 경제금융용어
- 이중통화채(dual currency bond)
- 백준 파티
- 웅덩이 매매법
- 자의식 해체
- 연방준비제도(FRS)/연방준비은행(FRB)
- 유전자오작동
- 부동산 기사읽기
- 급여액
- 백준 1238
- 특수목적기구
- KFO
- 엥겔의법칙
- 행크TV
- 월부TV
Archives
- Today
- Total
록키의 No Pain, No Gain
[BOJ] 1238 파티 본문
반응형
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