Submission #1161055

#TimeUsernameProblemLanguageResultExecution timeMemory
1161055sitablechairOlympic Bus (JOI20_ho_t4)C++20
16 / 100
1095 ms2120 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],g1[N]; ll ans[50003]; void dfs(int u,int idx) { vs[u]=1; for(auto i: g[u]) { if (i==idx) continue; int v=e[i].v; if (!vs[v]) dfs(v,idx); } } void solve(int s,int t) { For(i,1,n) g[i].clear(); fill(c+1,c+1+m,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); For(i,1,m) if (f[s][e[i].u]+f[e[i].v][t]+e[i].w==f[s][t]) { fill(vs,vs+1+n,0); dfs(s,i); c[i]=!(vs[t]); } 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]); int sigma=0; For(i,1,m) sigma+=c[i]; assert(sigma<=n); 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]; } 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...