본문 바로가기

PS/boj

백준 9694 무엇을 아느냐가 아니라 누구를 아느냐가 문제다

http://www.acmicpc.net/problem/9694 

 

9694번: 무엇을 아느냐가 아니라 누구를 아느냐가 문제다

맨위 첫 번째 줄에 T(1 <T< 100)는 테스트케이스 수를 의미한다. 이것을 따라 다음줄에 각 테스트 케이스가 주어지는데, 첫 번째 줄에는 N과 M이 주어진다. N(N ≤ 20)은 관계의 개수를 의미하며, M(5 ≤

www.acmicpc.net

다익스트라를 사용하여 푸는 문제였습니다.

기존 다익스트라 문제와 다른점은 최단 경로를 출력하는게 다른 점이었는데요. 저같은 경우 다익스트라의

dist배열을 갱신할때 같이 현재까지의 최단 경로를 기록한 route배열을 같이 갱신하여 풀었습니다. 

route[시작] = route[목적지]  route[목적지].push_back(목적지) 이런식으로 갱신했습니다.

#include <stdio.h>
#include<queue>
#include<iostream>
#include<vector>
using namespace std;
void fast_io() {
  cin.tie(0)->sync_with_stdio(0);
}
int N,M;
int main() {
    fast_io();
    int T;
    cin>>T;
    for(int test=1;test<=T;test++){
        cin>>N>>M;
        vector<vector<int>> route(M+1,vector<int>());
        vector<vector<pair<int,int>>> E(M+1,vector<pair<int,int>>());
        vector<int> dist(M+1,1e9);
        priority_queue<pair<int,int>> pq;
        for(int x=0;x<N;x++){
            int src,dst,cost;
            cin>>src>>dst>>cost;
            E[src].push_back({dst,cost});
            E[dst].push_back({src,cost});
        }        
        pq.push({0,0});
        route[0].push_back(0);
        while(!pq.empty()){
            int now=pq.top().second;
            int cost=-pq.top().first;
            pq.pop();
            if(dist[now]<cost) continue;
            for(auto i : E[now]){
                if(i.second+cost<dist[i.first]){
                    dist[i.first]=i.second+cost;
                    route[i.first]=route[now];
                    route[i.first].push_back(i.first);
                    pq.push({-dist[i.first],i.first});
                }
            } 
        }
        cout<<"Case #"<<test<<": ";
        for(auto i : route[M-1]){
            cout<<i<<" ";
        }
        if(route[M-1].empty()) cout<<-1;
        cout<<'\n';
    }
}

'PS > boj' 카테고리의 다른 글

백준 20917 사회적 거리 두기  (0) 2022.08.14
백준 15811 복면산?!  (0) 2022.08.10
백준 17492 바둑알 점프  (0) 2022.08.08
백준 6068 시간 관리하기  (0) 2022.08.07
백준 24678 돌 무더기 게임1  (0) 2022.08.06