Submission #212352

#TimeUsernameProblemLanguageResultExecution timeMemory
212352b00n0rpOlympic Bus (JOI20_ho_t4)C++17
0 / 100
860 ms3572 KiB
#include <algorithm> #include <cstdio> #include <iostream> #include <map> #include <queue> #include <set> #include <vector> using namespace std; typedef long long ll; #define int ll #define pb push_back #define REP(i,n) for (int i = 0; i < n; i++) #define FOR(i,a,b) for (int i = a; i < b; i++) #define remin(a,b) a = min(a,b) typedef map<int,int> mii; typedef vector<int> vi; typedef pair<int,int> pii; typedef vector<pii> vpii; #define F first #define S second #define sfl2(x,y) scanf("%lld%lld",&x,&y); #define pfi(x) printf("%d\n",x); #define pfl(x) printf("%lld\n",x); const int INF=1e10; int n,m; vector<pair<pii,pii> > edges; vi adj[205]; int dist[205][205]; int p1[205],p2[205]; int lol[205]; set<int> s; int dijkstra(){ REP(i,205) lol[i] = INF; lol[1] = 0; priority_queue<pii,vpii,greater<pii> > pq; pq.push({0,1}); while(pq.size()){ int u = pq.top().S; pq.pop(); for(auto e:adj[u]){ int v = edges[e].F.S,w = edges[e].S.F; if(lol[v] > lol[u]+w){ lol[v] = lol[u]+w; pq.push({lol[v],v}); p1[v] = e; } } } int res = lol[n]; REP(i,205) lol[i] = INF; lol[n] = 0; pq.push({0,n}); while(pq.size()){ int u = pq.top().S; pq.pop(); for(auto e:adj[u]){ int v = edges[e].F.S,w = edges[e].S.F; if(lol[v] > lol[u]+w){ lol[v] = lol[u]+w; pq.push({lol[v],v}); p2[v] = e; } } } return res+lol[1]; } signed main(){ sfl2(n,m) REP(i,205){ p1[i] = -1; p2[i] = -1; REP(j,205){ dist[i][j] = INF; } dist[i][i] = 0; } REP(i,m){ int u,v,c,d; sfl2(u,v) sfl2(c,d) edges.pb({{u,v},{c,d}}); adj[u].pb(i); adj[v].pb(i); remin(dist[u][v],c); } FOR(k,1,n+1){ FOR(i,1,n+1){ FOR(j,1,n+1){ remin(dist[i][j],dist[i][k]+dist[k][j]); } } } int ans = dist[1][n]+dist[n][1]; dijkstra(); // trace(dijkstra(),ans); FOR(i,1,n+1){ // trace(i,p1[i],p2[i]); if(p1[i] != -1) s.insert(p1[i]); if(p2[i] != -1) s.insert(p2[i]); } REP(i,m){ if(s.find(i) == s.end()){ // trace(i,edges[i].S.S,dist[1][edges[i].F.S],dist[edges[i].F.F][n],edges[i].S.F); remin(ans,edges[i].S.S+min(dist[1][n],dist[1][edges[i].F.S]+dist[edges[i].F.F][n]+edges[i].S.F)+min(dist[n][1],dist[n][edges[i].F.S]+dist[edges[i].F.F][1]+edges[i].S.F)); } else{ swap(edges[i].F.F,edges[i].F.S); // trace(i,dijkstra(),edges[i].S.S); remin(ans,dijkstra()+edges[i].S.S); swap(edges[i].F.F,edges[i].F.S); } } if(ans > 1LL*(1e12)) pfi(-1) else pfl(ans) }

Compilation message (stderr)

ho_t4.cpp: In function 'int main()':
ho_t4.cpp:22:24: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
 #define sfl2(x,y) scanf("%lld%lld",&x,&y);
                   ~~~~~^~~~~~~~~~~~~~~~~~
ho_t4.cpp:74:2: note: in expansion of macro 'sfl2'
  sfl2(n,m)
  ^~~~
ho_t4.cpp:22:24: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
 #define sfl2(x,y) scanf("%lld%lld",&x,&y);
                   ~~~~~^~~~~~~~~~~~~~~~~~
ho_t4.cpp:85:3: note: in expansion of macro 'sfl2'
   sfl2(u,v)
   ^~~~
ho_t4.cpp:22:24: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
 #define sfl2(x,y) scanf("%lld%lld",&x,&y);
                   ~~~~~^~~~~~~~~~~~~~~~~~
ho_t4.cpp:86:3: note: in expansion of macro 'sfl2'
   sfl2(c,d)
   ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...