Submission #1181049

#TimeUsernameProblemLanguageResultExecution timeMemory
1181049Szymon_PilipczukOlympic Bus (JOI20_ho_t4)C++20
5 / 100
1095 ms3840 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll infl = 1e18;
ll ans;
vector<vector<vector<ll>>> gr;
ll co[200][2];
priority_queue<vector<ll>,vector<vector<ll>>,greater<vector<ll>>> pq;
void dk(int p,ll c,int t)
{
    //cout<<p<<" "<<c<<" "<<t<<"\n";
    for(int i = 0;i<gr[p].size();i++)
    {
        /*if(p == 2 && t == 1)
        {
            cout<<gr[p][i][0]<<" "<<gr[p][i][1]<<"\n";
        }*/
        if(co[gr[p][i][0]][t] > c + gr[p][i][1])
        {
            co[gr[p][i][0]][t] = c + gr[p][i][1];
            pq.push({c + gr[p][i][1],gr[p][i][0],t});
        }
    }
}
int main()
{
    int n,m;
    cin>>n>>m;
    gr.resize(n);
    for(int i =0 ;i<m;i++)
    {
        int u,v,c,d;
        cin>>u>>v>>c>>d;
        u--;v--;
        gr[u].push_back({v,c,d});
    }
    ll tans = infl;
    for(int i = 0;i<n;i++)
    {
        for(int j = 0;j<gr[i].size();j++)
        {
            vector<ll> cu = gr[i][j];
            gr[i][j][1] = infl;
            gr[gr[i][j][0]].push_back({i,cu[1],cu[2] });
            ans = gr[i][j][2];
            pq.push({0,0,0});
            pq.push({0,n-1,1});
            for(int q = 0;q<n;q++)
            {
                co[q][0] = infl;
                co[q][1] = infl;
            }
            co[0][0] = 0;
            co[n-1][1] = 0;
            while(!pq.empty())
            {
                ll b =pq.top()[0];
                int a = pq.top()[1];
                int t = pq.top()[2];
                pq.pop();
                if(b == co[a][t]) dk(a,b,t);
            }
            //cout<<co[n-1][0]<<" "<<co[0][1]<<"\n";
            ans+= co[n-1][0];
            ans += co[0][1];
            tans = min(tans,ans);
            gr[cu[0]].pop_back();
            gr[i][j][1] = cu[1];
        }
    }
    ans = 0;
    pq.push({0,0,0});
    pq.push({0,n-1 ,1});
    for(int q = 0;q<n;q++)
    {
        co[q][0] = infl;
        co[q][1] = infl;
    }
    co[0][0] = 0;
    co[n-1][1] = 0;
    while(!pq.empty())
    {
        ll b =pq.top()[0];
        int a = pq.top()[1];
        int t = pq.top()[2];
        pq.pop();
        if(b == co[a][t]) dk(a,b,t);
    }
    ans+= co[n-1][0];
    ans += co[0][1];
    //cout<<co[n-1][0]<<" "<<co[0][1]<<"\n";
    tans = min(tans,ans);
    if(tans >= 1e18)
    {
        cout<<-1;
    }
    else
    {
        cout<<tans;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...