본문 바로가기

개발/알고리즘

백준 5719 거의최단경로 C++

문제

https://www.acmicpc.net/problem/5719

 

5719번: 거의 최단 경로

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 장소의 수 N (2 ≤ N ≤ 500)과 도로의 수 M (1 ≤ M ≤ 104)가 주어진다. 장소는 0부터 N-1번까지 번호가 매겨져 있

www.acmicpc.net

 

코드

#include <bits/stdc++.h>

using namespace std;

const int INF = 987654321;

int n, m, s, d, u, v, weight, dist[500], adj[500][500];

void dijkstra()
{
    fill(dist, dist + 500, INF);
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
    pq.push({ 0, s });
    dist[s] = 0;

    while (pq.size())
    {
        int curDist = pq.top().first;
        int curVertex = pq.top().second;
        pq.pop();

        if (dist[curVertex] != curDist)
            continue;

        for(int i = 0; i < n; i++)
        {
            //현재 정점에서 다음 정점으로 가는 가중치가 -1 == 최단거리인 간선을 -1로 갱신
            int nextDist = adj[curVertex][i];
            if(nextDist == -1)
                continue;
            
            if(dist[i] > dist[curVertex] + nextDist)
            {
                dist[i] = dist[curVertex] + nextDist;
                pq.push({dist[i], i});
            }
        }
    }
}

void deleteEdge()
{
    queue<int> q;
    q.push(d);

    while(q.size())
    {
        int curVertex = q.front();
        q.pop();

        for(int i = 0; i < n; i++)
        {
            if((dist[curVertex] == dist[i] + adj[i][curVertex]) && adj[i][curVertex] != -1)
            {
                adj[i][curVertex] = -1;
                q.push(i);
            }
        }
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    while (true)
    {
        cin >> n >> m;
        if (n == 0 && m == 0)
            break;

        fill(&adj[0][0], &adj[0][0] + 500 * 500, -1);

        cin >> s >> d;
        for (int i = 0; i < m; i++)
        {
            cin >> u >> v >> weight;
            adj[u][v] = weight;
        }

        dijkstra();
        deleteEdge();
        dijkstra();

        cout << (dist[d] == INF ? -1 : dist[d]) << '\n';
    }

    return 0;
}

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

펜윅 트리란?(Fenwick Tree, Binary Indexed Tree)  (0) 2021.05.28
누적합(Prefix Sum) 이란?  (0) 2021.05.27
백준 17612 쇼핑몰 C++  (0) 2021.05.16
백준 4375 1 C++  (0) 2021.05.15
백준 17471 게리맨더링 C++  (0) 2021.05.14