Submission #673746

#TimeUsernameProblemLanguageResultExecution timeMemory
673746MilosMilutinovicOlympic Bus (JOI20_ho_t4)C++14
100 / 100
957 ms3676 KiB
#include <bits/stdc++.h> using namespace std; #define rep(i,a,n) for (int i=a;i<n;i++) #define per(i,a,n) for (int i=n-1;i>=a;i--) #define pb push_back #define eb emplace_back #define mp make_pair #define all(x) (x).begin(),(x).end() #define fi first #define se second #define SZ(x) ((int)(x).size()) typedef vector<int> VI; typedef basic_string<int> BI; typedef long long ll; typedef pair<int,int> PII; typedef double db; mt19937 mrand(random_device{}()); const ll mod=1000000007; int rnd(int x) { return mrand() % x;} ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;} ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;} // head const int N=202; const int M=50500; const ll inf=1e18; int n,m,u[M],v[M],c[M],d[M],prv[2][N]; ll dis[2][N],f[N][N]; bool is[M]; vector<array<int,3>> e[N]; void dijkstra(int v,ll* d,int* pp) { rep(i,1,n+1) d[i]=inf; d[v]=0; pp[v]=-1; priority_queue<pair<ll,int>> pq; pq.push({0,v}); while (SZ(pq)) { int i=pq.top().second; ll dd=-pq.top().first; pq.pop(); if (dd>d[i]) continue; for (auto& p:e[i]) { int j=p[0],w=p[1]; if (d[j]>d[i]+w) { d[j]=d[i]+w; pp[j]=p[2]; pq.push({-d[j],j}); } } } } ll solve(int id) { rep(i,1,n+1) e[i].clear(); rep(i,0,m) { if (i==id) e[v[i]].pb({u[i],c[i],i}); else e[u[i]].pb({v[i],c[i],i}); } dijkstra(1,dis[0],prv[0]); dijkstra(n,dis[1],prv[1]); return dis[0][n]+dis[1][1]+d[id]; } int main() { scanf("%d%d",&n,&m); rep(i,1,n+1) rep(j,1,n+1) f[i][j]=inf; rep(i,0,m) { scanf("%d%d%d%d",u+i,v+i,c+i,d+i); e[u[i]].pb({v[i],c[i],i}); f[u[i]][v[i]]=min(f[u[i]][v[i]],(ll)c[i]); } rep(i,1,n+1) f[i][i]=0; rep(k,1,n+1) rep(i,1,n+1) rep(j,1,n+1) f[i][j]=min(f[i][j],f[i][k]+f[k][j]); dijkstra(1,dis[0],prv[0]); dijkstra(n,dis[1],prv[1]); rep(j,0,2) rep(i,1,n+1) if (prv[j][i]!=-1) is[prv[j][i]]=1; ll ans=dis[0][n]+dis[1][1]; rep(i,0,m) { if (is[i]) { ans=min(ans,solve(i)); } else { ll d1=min(f[1][n],f[1][v[i]]+c[i]+f[u[i]][n]); ll d2=min(f[n][1],f[n][v[i]]+c[i]+f[u[i]][1]); ans=min(ans,d1+d2+d[i]); } } if (ans>=inf) ans=-1; printf("%lld",ans); }

Compilation message (stderr)

ho_t4.cpp: In function 'int main()':
ho_t4.cpp:65:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   65 |  scanf("%d%d",&n,&m);
      |  ~~~~~^~~~~~~~~~~~~~
ho_t4.cpp:69:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   69 |   scanf("%d%d%d%d",u+i,v+i,c+i,d+i);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...