Notice
Recent Posts
Recent Comments
«   2024/11   »
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
Archives
Today
Total
관리 메뉴

블로그 언저리인 무언가

[백준/BOJ] 9370 미확인 도착지 본문

Programming/BOJ

[백준/BOJ] 9370 미확인 도착지

he1fire 2020. 9. 26. 02:30
728x90

문제 : 9370 미확인 도착지

 

9370번: 미확인 도착지

(취익)B100 요원, 요란한 옷차림을 한 서커스 예술가 한 쌍이 한 도시의 거리들을 이동하고 있다. 너의 임무는 그들이 어디로 가고 있는지 알아내는 것이다. 우리가 알아낸 것은 그들이 s지점에서

www.acmicpc.net

예술가들의 출발지와 목적지 후보가 주어졌을때,

어떤 도로를 지나서 최단거리로 갈수있는 모든 후보를 출력하는 문제이다.

Dijkstra 알고리즘을 사용해 출발지~도착지까지의 최단거리가

출발지~교차로+도로의 길이+교차로~도착지의 최단거리와같은 경우를 찾아 출력하면 된다.


Code

#include <bits/stdc++.h>
#define ll long long
#define INF 1e9+7
using namespace std;
struct ABC{
    ll idx, dst;
    ABC(){}
    ABC(ll idx, ll dst) : idx(idx), dst(dst) {}
};
bool operator<(ABC x, ABC y){
    return x.dst>y.dst;
}
ll T, visit[2005];
vector<ABC> arr[2005];
priority_queue<ABC> pq;
ll Dijkstra(ll st, ll ed){
    fill(&visit[0],&visit[2004],INF);
    pq.push({st,0});
    visit[st]=0;
    while (!pq.empty()){
        ll x=pq.top().idx, curr=pq.top().dst;
        pq.pop();
        if (visit[x]<curr)
            continue;
        for (int i=0;i<arr[x].size();i++){
            ll dx=arr[x][i].idx, next=arr[x][i].dst;
            if (visit[dx]>next+curr){
                visit[dx]=next+curr;
                pq.push({dx,next+curr});
            }
        }
    }
    return visit[ed];
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> T;
    while (T--){
        ll n, m, t, s, g, h, len;
        vector<ll> v;
        cin >> n >> m >> t >> s >> g >> h;
        for (int i=0;i<2005;i++){
            arr[i].clear();
        }
        for (int i=0;i<m;i++){
            ll a, b, c;
            cin >> a >> b >> c;
            arr[a].push_back({b,c});
            arr[b].push_back({a,c});
            if ((a==g && b==h) || (a==h && b==g))
                len=c;
        }
        for (int i=0;i<t;i++){
            ll a;
            cin >> a;
            v.push_back(a);
        }
        sort(v.begin(),v.end());
        for (auto i:v){
            if (Dijkstra(s,i)==len+min(Dijkstra(s,g)+Dijkstra(h,i),Dijkstra(s,h)+Dijkstra(g,i)))
                cout << i << " ";
        }
        cout << "\n";
    }
    return 0;
}
728x90

'Programming > BOJ' 카테고리의 다른 글

[백준/BOJ] 14370 전화번호 수수께끼 (Large)  (0) 2020.09.27
[백준/BOJ] 4388 받아올림  (0) 2020.09.27
[백준/BOJ] 1753 최단경로  (0) 2020.09.26
[백준/BOJ] 17953 디저트  (0) 2020.09.25
[백준/BOJ] 15724 주지수  (0) 2020.09.24
Comments