제출 #915042

#제출 시각아이디문제언어결과실행 시간메모리
915042asdfGuestCommuter Pass (JOI18_commuter_pass)C++14
31 / 100
494 ms45132 KiB
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>

using namespace std;

#define INF (1000000000ll * 200000ll)

typedef long long ll;

struct adj_t {
    int nx;
    ll w;
};

int n, m;
vector<adj_t> adj[100001], adj_inv[100001];

vector<ll> dijkstra(int start, vector<adj_t> *adj_mat) {
    vector<ll> dist(n + 1, INF);
    priority_queue<pair<ll, int>> heap;
    
    heap.push({-0ll, start});
    dist[start] = 0ll;

    while (!heap.empty()) {
        int nw = heap.top().second;
        ll d = -heap.top().first;
        heap.pop();
        
        if (d > dist[nw])
            continue;
        
        for (int i = 0; i < adj_mat[nw].size(); i++) {
            auto nex = adj_mat[nw][i];
            ll new_cost = d + nex.w;

            if (new_cost < dist[nex.nx]) {
                heap.push({-new_cost, nex.nx});
                dist[nex.nx] = new_cost;
            }
        }
    }

    return dist;
}
vector<pair<int, int>> shortest_path(int start, int end, vector<adj_t> *adj_mat) {
    vector<ll> dist(n + 1, INF);
    vector<int> memo[100001];
    vector<pair<int, int>> edge;

    priority_queue<pair<ll, int>> heap;
    
    heap.push({-0, start});
    dist[start] = 0;

    while (!heap.empty()) {
        int nw = heap.top().second;
        ll d = -heap.top().first;
        heap.pop();

        if (d > dist[nw])
            continue;
        
        for (int i = 0; i < adj_mat[nw].size(); i++) {
            auto nex = adj_mat[nw][i];
            ll new_cost = d + nex.w;

            if (new_cost < dist[nex.nx]) {
                heap.push({-new_cost, nex.nx});
                dist[nex.nx] = new_cost;

                memo[nex.nx].clear();
                memo[nex.nx].push_back(nw);
            }
            else if (new_cost == dist[nex.nx])
                memo[nex.nx].push_back(nw);
        }
    }

    bool visit[100001] = {false};
    queue<int> bfsQ;

    bfsQ.push(end);
    visit[end] = true;

    while (!bfsQ.empty()) {
        int nw = bfsQ.front();
        bfsQ.pop();

        for (int i = 0; i < memo[nw].size(); i++) {
            int nex = memo[nw][i];

            if (!visit[nex]) {
                bfsQ.push(nex);
                visit[nex] = true;
            }

            edge.push_back({nex, nw});
        }
    }

    return edge;
}

int main(void) {
    int s, t, u, v;
    scanf("%d %d %d %d %d %d", &n, &m, &s, &t, &u, &v);

    for (int i = 0; i < m; i++) {
        int a, b, c;
        scanf("%d %d %d", &a, &b, &c);
        adj[a].push_back({b, (ll)c});
        adj[b].push_back({a, (ll)c});
        adj_inv[a].push_back({b, (ll)c});
        adj_inv[b].push_back({a, (ll)c});
    }

    auto edge = shortest_path(s, t, adj);
    for (int i = 0; i < edge.size(); i++) {
        adj[edge[i].first].push_back({edge[i].second, 0ll});
        adj_inv[edge[i].second].push_back({edge[i].first, 0ll});
    }
    
    auto udis1 = dijkstra(u, adj), vdis1 = dijkstra(v, adj_inv);
    auto udis2 = dijkstra(u, adj_inv), vdis2 = dijkstra(v, adj);
    ll ans = INF;
    
    for (int i = 1; i <= n; i++)
        ans = min(ans, min(udis1[i] + vdis1[i], udis2[i] + vdis2[i]));

    printf("%lld\n", ans);
  
    return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

commuter_pass.cpp: In function 'std::vector<long long int> dijkstra(int, std::vector<adj_t>*)':
commuter_pass.cpp:35:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<adj_t>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   35 |         for (int i = 0; i < adj_mat[nw].size(); i++) {
      |                         ~~^~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp: In function 'std::vector<std::pair<int, int> > shortest_path(int, int, std::vector<adj_t>*)':
commuter_pass.cpp:66:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<adj_t>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   66 |         for (int i = 0; i < adj_mat[nw].size(); i++) {
      |                         ~~^~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:92:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   92 |         for (int i = 0; i < memo[nw].size(); i++) {
      |                         ~~^~~~~~~~~~~~~~~~~
commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:121:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  121 |     for (int i = 0; i < edge.size(); i++) {
      |                     ~~^~~~~~~~~~~~~
commuter_pass.cpp:109:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  109 |     scanf("%d %d %d %d %d %d", &n, &m, &s, &t, &u, &v);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:113:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  113 |         scanf("%d %d %d", &a, &b, &c);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...