제출 #204069

#제출 시각아이디문제언어결과실행 시간메모리
204069KastandaCommuter Pass (JOI18_commuter_pass)C++11
100 / 100
405 ms30956 KiB
// In The Name Of The Queen
#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef long long ll;
const int N = 100005;
int n, m, st, fn, vs, ut, M[N], M2[N];
ll Mn = LLONG_MAX, dp[N];
vector < int > Ad[N], Adt[N];
vector < pair < int , int > > Adj[N];
priority_queue < pair < ll , int > > Pq;
vector < ll > Dst, Dvs, Dut;
vector < ll > SSSP(int v)
{
    vector < ll > D(n + 1, (ll)(1e18));
    D[v] = 0; Pq.push({0, v});
    while (Pq.size())
    {
        ll d = - Pq.top().first;
        v = Pq.top().second; Pq.pop();
        if (d > D[v])
            continue;
        for (auto u : Adj[v])
            if (D[u.x] > D[v] + u.y)
                D[u.x] = D[v] + u.y, Pq.push({-D[u.x], u.x});
    }
    return (D);
}
void DFS(int v)
{
    M[v] = 1;
    dp[v] = Dut[v];
    for (int u : Ad[v])
    {
        if (!M2[u])
            continue;
        if (!M[u])
            DFS(u);
        dp[v] = min(dp[v], dp[u]);
        Mn = min(Mn, Dvs[v] + dp[u]);
    }
}
void DFS2(int v)
{
    M2[v] = 1;
    for (int u : Adt[v])
        if (!M2[u])
            DFS2(u);
}
int main()
{
    scanf("%d%d%d%d%d%d", &n, &m, &st, &fn, &vs, &ut);
    for (int i = 1; i <= m; i ++)
    {
        int v, u, w;
        scanf("%d%d%d", &v, &u, &w);
        Adj[v].push_back({u, w});
        Adj[u].push_back({v, w});
    }
    Dst = SSSP(st);
    Dvs = SSSP(vs);
    Dut = SSSP(ut);
    for (int i = 1; i <= n; i ++)
        for (auto u : Adj[i])
            if (Dst[u.x] == Dst[i] + u.y)
                Ad[i].push_back(u.x),
                Adt[u.x].push_back(i);
    Mn = Dvs[ut];
    DFS2(fn);
    DFS(st);
    Dvs.swap(Dut);
    memset(M, 0, sizeof(M));
    DFS(st);
    return !printf("%lld\n", Mn);
}

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

commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:53:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d%d%d%d%d", &n, &m, &st, &fn, &vs, &ut);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:57:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d%d", &v, &u, &w);
         ~~~~~^~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...