제출 #136302

#제출 시각아이디문제언어결과실행 시간메모리
136302KLPPCommuter Pass (JOI18_commuter_pass)C++14
100 / 100
625 ms69580 KiB
#include<bits/stdc++.h> using namespace std; typedef long long int lld; typedef pair<lld,lld> pii; #define rep(i,a,b) for(int i=a;i<b;i++) #define trav(a,v) for(auto a:v) #define INF 10000000000000000 int n,m,s,t,u,v; vector<pii> nei[1000000]; vector<int> tree[1000000]; lld dist[1000000]; priority_queue<pii> pq; void calc(int init){ rep(i,0,n)dist[i]=INF; dist[init]=0; pq.push(pii(0,init)); while(!pq.empty()){ int u=pq.top().second; lld d=-pq.top().first; pq.pop(); if(d>dist[u])continue; //cout<<u<<" "<<d<<endl; trav(V,nei[u]){ //cout<<v.first<<"A"<<v.second<<" "<<d<<" "<<dist[v.first]<<endl; if(dist[V.first]>V.second+d){ dist[V.first]=V.second+d; pq.push(pii(-dist[V.first],V.first)); } } } } bool visited[1000000]; void Rev(int node){ visited[node]=true; trav(V,nei[node]){ if(dist[V.first]+V.second==dist[node]){ tree[node].push_back(V.first); if(!visited[V.first])Rev(V.first); } } } lld dist_u[1000000]; lld dist_v[1000000]; lld min_dist_u[1000000]; lld min_dist_v[1000000]; lld calc_u(int node){ if(min_dist_u[node]!=-1)return min_dist_u[node]; min_dist_u[node]=dist_u[node]; trav(V,tree[node]){ min_dist_u[node]=min(min_dist_u[node],calc_u(V)); } return min_dist_u[node]; } lld calc_v(int node){ if(min_dist_v[node]!=-1)return min_dist_v[node]; min_dist_v[node]=dist_v[node]; trav(V,tree[node]){ min_dist_v[node]=min(min_dist_v[node],calc_v(V)); } return min_dist_v[node]; } int main(){ scanf("%d %d",&n,&m); scanf("%d %d",&s,&t); s--;t--; scanf("%d %d",&u,&v); u--;v--; rep(i,0,m){ int x,y; lld c; scanf("%d %d %lld",&x,&y,&c); x--;y--; nei[x].push_back(pii(y,c)); nei[y].push_back(pii(x,c)); } calc(s); //rep(i,0,n)cout<<dist[i]<<endl; rep(i,0,n){ visited[i]=false; } Rev(t); /*rep(i,0,n){ trav(v,tree[i])cout<<v<<" "; cout<<endl; }*/ calc(u); rep(i,0,n){ dist_u[i]=dist[i]; min_dist_u[i]=-1; } calc(v); rep(i,0,n){ dist_v[i]=dist[i]; min_dist_v[i]=-1; } lld ans=dist_u[v]; rep(i,0,n){ if(visited[i]){ calc_u(i); calc_v(i); ans=min(ans,dist_v[i]+min_dist_u[i]); ans=min(ans,dist_u[i]+min_dist_v[i]); } } printf("%lld\n",ans); return 0; }

컴파일 시 표준 에러 (stderr) 메시지

commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:65:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d",&n,&m);
   ~~~~~^~~~~~~~~~~~~~~
commuter_pass.cpp:66:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d",&s,&t);
   ~~~~~^~~~~~~~~~~~~~~
commuter_pass.cpp:68:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d",&u,&v);
   ~~~~~^~~~~~~~~~~~~~~
commuter_pass.cpp:73:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d %lld",&x,&y,&c);
     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...