Submission #1264708

#TimeUsernameProblemLanguageResultExecution timeMemory
1264708tvgkOlympic Bus (JOI20_ho_t4)C++20
0 / 100
15 ms8520 KiB
#include<bits/stdc++.h>
using namespace std;
#define task "a"
#define ll long long
#define ii pair<ll, ll>
#define fi first
#define se second
const long mxN = 1e5 + 7, inf = 2e9 + 7;

int n, m, u[mxN], v[mxN], c[mxN], sw[mxN];
ll mn[mxN][5];
ii trace[mxN][5];
bool use[5][mxN];
vector<ii> w[mxN][2];

void DFS(int stt, int en, int spe, int id, int tt)
{
    for (int i = 1; i <= n; i++)
    {
        mn[i][tt] = inf;
        trace[i][tt] = {0, 0};
    }

    priority_queue<ii, vector<ii>, greater<ii>> pq;
    pq.push({0, stt});
    mn[stt][tt] = 0;

    while (pq.size())
    {
        ii j = pq.top();
        pq.pop();

        if (j.fi != mn[j.se][tt])
            continue;

        for (ii i : w[j.se][id])
        {
            if (i.se != spe && mn[i.fi][tt] > j.fi + c[i.se])
            {
                mn[i.fi][tt] = j.fi + c[i.se];
                trace[i.fi][tt] = {j.se, i.se};
                pq.push({mn[i.fi][tt], i.fi});
            }
        }
    }

    while (en)
    {
        use[tt][trace[en][tt].se] = 1;
        en = trace[en][tt].fi;
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    //freopen(a".INP", "r", stdin);
    //freopen(a".OUT", "w", stdout);

    cin >> n >> m;
    for (int i = 1; i <= m; i++)
    {
        cin >> u[i] >> v[i] >> c[i] >> sw[i];
        sw[i] += c[i];
        w[u[i]][0].push_back({v[i], i});
        w[v[i]][1].push_back({u[i], i});
    }
    DFS(1, n, 0, 0, 0);
    DFS(n, 1, 0, 0, 1);
    DFS(1, n, 0, 1, 2);
    DFS(n, 1, 0, 1, 3);

    ll ans = mn[n][0] + mn[1][1];
    for (int i = 1; i <= m; i++)
    {
        if (use[0][i])
        {
            DFS(1, n, i, 0, 4);
            ans = min(ans, mn[n][4] + sw[i] + mn[u[i]][2] + mn[v[i]][1]);
        }
        else
            ans = min(ans, mn[n][0] + sw[i] + mn[u[i]][2] + mn[v[i]][1]);

        if (use[1][i])
        {
            DFS(n, 1, i, 0, 4);
            ans = min(ans, mn[1][4] + sw[i] + mn[u[i]][3] + mn[v[i]][0]);
        }
        else
            ans = min(ans, mn[1][1] + sw[i] + mn[u[i]][3] + mn[v[i]][0]);
    }

    if (ans >= inf)
        cout << -1;
    else
        cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...