제출 #1123411

#제출 시각아이디문제언어결과실행 시간메모리
1123411whoknowCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
462 ms21548 KiB
#include <bits/stdc++.h>
#define ll long long
#define F first
#define S second
#define MAXN 100005
#define ii pair<ll,int>
#define bit(i,j) ((i>>j)&1)
#define sz(i) (int)i.size()
#define endl '\n'
using namespace std;
const ll INF  = 1e18 + 7;
int n, m, S, T, U, V;
vector<ii>g[MAXN];
namespace sub1
{
ll d[4][MAXN], dp1[MAXN], dp2[MAXN];
void bfs(int k, int st)
{
    for(int i = 1; i <= n; i++)
        d[k][i] = INF;
    priority_queue<ii, vector<ii>, greater<ii>>q;
    q.push({0, st});
    d[k][st] = 0;
    while(q.empty() != 1)
    {
        ii top = q.top();
        q.pop();
        ll kc = top.F;
        int u = top.S;
        for(ii i : g[u])
        {
            int v = i.F, w = i.S;
            if(d[k][v] > kc + w)
            {
                d[k][v] = kc + w;
                q.push({d[k][v], v});
            }
        }
    }
}
void calc1()
{
    priority_queue<ii, vector<ii>, greater<ii>>q;
    for(int i = 1; i <= n; i++)
    {
        dp1[i] = d[2][i];
        q.push({dp1[i], i});
    }
    while(q.empty() != 1)
    {
        ii top = q.top();
        q.pop();
        ll kc = top.F;
        int u = top.S;
        for(ii i : g[u])
        {
            int v = i.F, w = i.S;
            if(d[0][v] + d[1][v] == d[0][T] && d[0][v] == d[0][u] + w && dp1[v] > kc)
            {
                dp1[v] = kc;
                q.push({kc, v});
            }
        }
    }
}
void calc2()
{
    priority_queue<ii, vector<ii>, greater<ii>>q;
    for(int i = 1; i <= n; i++)
    {
        dp2[i] = d[2][i];
        q.push({dp2[i], i});
    }
    while(q.empty() != 1)
    {
        ii top = q.top();
        q.pop();
        ll kc = top.F;
        int u = top.S;
        for(ii i : g[u])
        {
            int v = i.F, w = i.S;
            if(d[0][v] + d[1][v] == d[0][T] && d[1][v] == d[1][u] + w && dp2[v] > kc)
            {
                dp2[v] = kc;
                q.push({kc, v});
            }
        }
    }
}
void solve()
{
    bfs(0, S);
    bfs(1, T);
    bfs(2, U);
    bfs(3, V);
    calc1();
    calc2();
    ll res = d[2][V];
    for(int i = 1; i <= n; i++)
        res = min(res, d[3][i] + min(dp1[i], dp2[i]));
    cout << res;
}
}
main()
{
    if(fopen("TEST.inp", "r"))
    {
        freopen("TEST.inp", "r", stdin);
        freopen("TEST.out", "w", stdout);
    }
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> m >> S >> T >> U >> V;
    for(int i = 1; i <= m; i++)
    {
        int x, y, z;
        cin >> x >> y >> z;
        g[x].push_back({y, z});
        g[y].push_back({x, z});
    }
    sub1::solve();
//    cerr << "\nTIME: " << 1.0 * clock() / CLOCKS_PER_SEC << endl;
}

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

commuter_pass.cpp:105:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  105 | main()
      | ^~~~
commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:109:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  109 |         freopen("TEST.inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:110:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  110 |         freopen("TEST.out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...