#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using ld = long double;
const ll N = 1e6 + 5;
const ll base = 37;
const ll inf = LLONG_MAX/4;
const ll mod = 998244353;
#define bit(x,y) ((x >> y) & 1)
ll n,m;
typedef struct
{
    ll c,d,id;
}haha;
vector<haha> a[205][205];
vector<ll> g[N];
ll d[205][205];
ll cmp(haha t1, haha t2)
{
    return t1.c + t1.d < t2.c + t2.d;
}
vector<ll> siu;
ll u[50005],v[50005],c[50005],bl,c2[50005];
ll seen[50005][2];
ll ti = 0;
ll dij()
{
    ti++;
    priority_queue<pair<ll,pair<ll,ll>>,vector<pair<ll,pair<ll,ll>>>,greater<pair<ll,pair<ll,ll>>>> pq;
    pq.push({0,{1,0}});
    while(!pq.empty())
    {
        ll dis = pq.top().first;
        ll x = pq.top().second.first;
        ll t = pq.top().second.second;
        pq.pop();
        if(seen[x][t] == ti) continue;
        seen[x][t] = ti;
        if(x == 1 && t == 1) return dis;
        for(auto id : g[x])
        {
            if(id == bl) continue;
            ll y = v[id];
            ll add = c[id];
            ll nt = t;
            if(y == n) nt = 1;
            if(seen[y][nt] != ti) pq.push({dis + add,{y,nt}});
        }
    }
    return inf;
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin >> n >> m;
    ll i,j;
    for(i = 1;i <= n;i++)
    {
        for(j = 1;j <= n;j++)
        {
            d[i][j] = inf;
        }
        d[i][i] = 0;
    }
    for(i = 1;i <= m;i++)
    {
        cin >> u[i] >> v[i] >> c[i] >> c2[i];
        d[u[i]][v[i]] = min(d[u[i]][v[i]],c[i]);
        g[u[i]].push_back(i);
        haha tmp;
        tmp.c = c[i];
        tmp.d = c2[i];
        tmp.id = i;
        a[u[i]][v[i]].push_back(tmp);
    }
    for(i = 1;i <= n;i++)
    {
        for(j = 1;j <= n;j++)
        {
            if(i == j) continue;
            sort(a[i][j].begin(),a[i][j].end(),cmp);
            if(a[i][j].size() >= 1)
            {
                if(a[i][j][0].c + a[i][j][0].d < d[j][i])
                {
                    siu.push_back(a[i][j][0].id);
                }
            }
            if(a[i][j].size() >= 2)
            {
                if(a[i][j][1].c + a[i][j][1].d < d[j][i])
                {
                    siu.push_back(a[i][j][1].id);
                }
            }
        }
    }
    //cout << siu.size();
    ll ans = dij();
    for(auto sus : siu)
    {
        v[m + 1] = u[sus];
        u[m + 1] = v[sus];
        c[m + 1] = c[sus];
        bl = sus;
        g[v[sus]].push_back(m + 1);
        ans = min(ans,dij() + c2[sus]);
        g[v[sus]].pop_back();
    }
    if(ans == inf) cout << -1;
    else cout << ans;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |