반응형
✏️ 문제 링크
https://www.acmicpc.net/problem/1238
1238번: 파티
첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X가 공백으로 구분되어 입력된다. 두 번째 줄부터 M+1번째 줄까지 i번째 도로의 시작점, 끝점, 그리고 이 도로를 지나는데 필요한 소요시간 Ti가 들어
www.acmicpc.net
✏️ 문제 설명 (더보기 클릭 👆🏻)
✏️ 문제 풀이
1. i번째 학생이 X마을에 도착하는 최단 시간을 구한다.
2. X마을에서 i번째 마을로 i번째 학생이 돌아오는 최단 시간을 구한다.
3. 1,2번의 결과 값을 더해 answer에 max값을 넣어준다.
for(int i=1; i<=N; i++){
//각 i번째 학생이 X 마을에 도착하는시간
int ItoX=dijkstra(i, X);
//i번째 학생이 X마을에서 출발해 돌아오는 시간
int XtoI=dijkstra(X, i);
answer=max(answer, ItoX+XtoI);
}
✏️ 문제 코드
#include <bits/stdc++.h>
using namespace std;
using pii=pair<int, int>;
#define MAX 1001
#define INF 987654321
vector<pii> vec[MAX];
int N, M, X;
int dijkstra(int s, int e){
vector<int> dist(N+1, INF);
priority_queue<pii> pq; pq.push({0, s});
dist[s]=0;
while(!pq.empty()){
pii t=pq.top(); pq.pop();
int c=t.second; int d=t.first*-1;
if(dist[c]<d)continue;
for(int i=0; i<vec[c].size(); i++){
int nxt=vec[c][i].first;
int nxt_d=vec[c][i].second + d;
if(dist[nxt]>nxt_d){
dist[nxt]=nxt_d;
pq.push({nxt_d*-1, nxt});
}
}
}
return dist[e];
}
int main(){
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int answer=0; cin>>N>>M>>X;
while(M--){
int a, b, c; cin>>a>>b>>c;
vec[a].push_back({b, c});
}
for(int i=1; i<=N; i++){
//각 i번째 학생이 X 마을에 도착하는시간
int ItoX=dijkstra(i, X);
//i번째 학생이 X마을에서 출발해 돌아오는 시간
int XtoI=dijkstra(X, i);
answer=max(answer, ItoX+XtoI);
}
cout<<answer<<"\n";
return 0;
}
⭐ if feedback and question : comment please⭐
반응형
'Algorithm 💫 > Problem Solving' 카테고리의 다른 글
[백준] 2003번: 수들의 합2 / C++ (0) | 2021.09.30 |
---|---|
[백준] 1162번: 도로포장 / C++ (0) | 2021.09.28 |
[백준] 17396번: 백도어 / C++ (0) | 2021.09.27 |
[백준] 14284번: 간선 이어가기2 / C++ (0) | 2021.09.27 |
[백준] 5972번: 택배 배송 / C++ (0) | 2021.09.27 |
댓글