제출 #1161031

#제출 시각아이디문제언어결과실행 시간메모리
1161031sitablechairOlympic Bus (JOI20_ho_t4)C++20
11 / 100
32 ms2628 KiB
#include <bits/stdc++.h>

#define ll long long
#define ldb long double
#define endl '\n'
#define For(i,l,r) for(int i=l;i<=r;i++)
#define ForD(i,r,l) for(int i=r;i>=l;i--)
#define ff first
#define ss second
#define pb push_back
#define all(x) x.begin(),x.end()
#define sz(x) (signed)x.size()
#define unq(x) x.resize(unique(all(x))-x.begin())
#define F "TASK"
#define fio freopen(F".INP","r",stdin);freopen(F".OUT","w",stdout);

#ifdef NCGM
#include"debug.h"
#else 
#define debug(...) "fr";
#endif

using namespace std;

const int MOD=1e9+7,N=203;

struct Edge {
    int u,v,w,d;
};

int n,m;
ll f[N][N],f1[N][N];
Edge e[50003];
bool c[50003],vs[N];
vector<int> g[N],tp;
ll ans[50003],dp1[N],dp2[N];

void dfs(int u) {
    for(auto i: g[u])
        if (!vs[e[i].v]) {
            vs[e[i].v]=1;
            dfs(e[i].v);
        }
    tp.pb(u);
}

void solve(int s,int t) {
    For(i,1,n) g[i].clear();
    fill(c+1,c+1+m,0);
    fill(vs+1,vs+1+n,0);
    For(i,1,m)
        if (f[s][e[i].u]+f[e[i].v][t]+e[i].w==f[s][t]) g[e[i].u].pb(i);
    tp.clear();
    For(i,1,n)
        if (!vs[i]) dfs(i);
    fill(dp1,dp1+1+n,0);
    fill(dp2,dp2+1+n,0);
    dp1[s]=1;
    dp2[t]=1;
    reverse(all(tp));
    for(auto u: tp) 
        for(auto i: g[u]) {
            int v=e[i].v;
            dp1[v]=(dp1[v]+dp1[u])%MOD;
        }
    ForD(j,sz(tp)-1,0) {
        int u=tp[j];
        for(auto i: g[u]) {
            int v=e[i].v;
            dp2[u]=(dp2[u]+dp2[v])%MOD;
        }
    }
    For(i,1,n)
        for(auto el: g[i]) {
            int u=e[el].u,v=e[el].v;
            ll kk=1LL*dp1[u]*dp2[v]%MOD;
            kk=(kk-dp1[t])%MOD;
            if (kk==0) c[el]=1;
        }
    For(i,1,n) {
        For(j,1,n) 
            f1[i][j]=1e17;
        f1[i][i]=0;
    }    
    For(i,1,m)
        if (!c[i]) f1[e[i].u][e[i].v]=min(f1[e[i].u][e[i].v],(ll)e[i].w);
    For(k,1,n)
        For(i,1,n)
            For(j,1,n) f1[i][j]=min(f1[i][j],f1[i][k]+f1[k][j]); 
    For(i,1,m) {
        ll tmp=1e18;
        int u=e[i].u,v=e[i].v,w=e[i].w;
        if (f[s][u]>=f[s][v]) {
            tmp=f[s][v]+w+f[u][t];  
            // debug(i,tmp);
        }
        if (c[i]) {
            For(j,1,n)
                For(k,1,n) {
                    if (f[s][u]+f[v][j]+w!=f[s][j] && f[k][u]+w+f[v][t]!=f[k][t]) 
                        tmp=min(tmp,f[s][j]+f[k][t]+f1[j][k]);     
                }
        } else tmp=min(tmp,f[s][t]);
        ans[i]+=tmp;
    }
}

int main() {
    cin.tie(0)->sync_with_stdio(0);
    cin >> n >> m;
    For(i,1,m) {
        cin >> e[i].u >> e[i].v >> e[i].w >> e[i].d;
       
    } 
    For(i,1,n) {
        For(j,1,n) 
            f[i][j]=f1[i][j]=1e17;
        f[i][i]=f1[i][i]=0;
    }
    For(i,1,m) f[e[i].u][e[i].v]=min(f[e[i].u][e[i].v],(ll)e[i].w);
    For(k,1,n)
        For(i,1,n)
            For(j,1,n) f[i][j]=min(f[i][j],f[i][k]+f[k][j]); 
   
    ll res=1e18;
    solve(1,n);
    solve(n,1);
    For(i,1,m)  
        res=min(res,ans[i]+e[i].d);
    res=min(res,f[1][n]+f[n][1]);
    if (res>=1e16) cout << -1 << endl;
    else cout << res << endl;
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...