제출 #48518

#제출 시각아이디문제언어결과실행 시간메모리
48518PajarajaEvacuation plan (IZhO18_plan)C++17
100 / 100
1243 ms50112 KiB
#include <bits/stdc++.h> using namespace std; vector<int> g[100007],gt[100007],c[100007],z; int d[100007],arr[100007],dsu[100007],p[20][100007],in[100007],out[100007],n,ti,l[20][100007]; bool vi[100007]; int root(int u) { while(dsu[u]!=u) { dsu[u]=dsu[dsu[u]]; u=dsu[u]; } return u; } bool cmp(int a,int b) {return d[a]>d[b];} void simuldij() { priority_queue<pair<int,int> > pq; for(int i=0;i<z.size();i++) pq.push(make_pair(0,z[i])); while(!pq.empty()) { int s=pq.top().second,a=-pq.top().first; pq.pop(); if(vi[s]) continue; vi[s]=true; d[s]=a; for(int i=0;i<g[s].size();i++) pq.push(make_pair(-a-c[s][i],g[s][i])); } } void dfs(int s,int f) { p[0][s]=f; l[0][s]=d[s]; in[s]=ti++; for(int i=0;i<gt[s].size();i++) dfs(gt[s][i],s); out[s]=ti++; } void lcainit() { dfs(arr[n],0); in[0]=-1; out[0]=1000000000; l[0][0]=2000000000; d[0]=2000000000; for(int i=1;i<20;i++) for(int j=1;j<=n;j++) {l[i][j]=min(l[i-1][j],l[i-1][p[i-1][j]]); p[i][j]=p[i-1][p[i-1][j]];} } bool insub(int a,int b) {return in[a]>=in[b] && out[a]<=out[b];} int query(int a,int b) { int x=a,y=b,sol=2000000000; for(int i=19;i>=0;i--) if(!insub(b,p[i][x])) {sol=min(sol,l[i][x]); x=p[i][x];} sol=min(sol,d[x]); if(!insub(b,a)) sol=min(sol,d[p[0][x]]); for(int i=19;i>=0;i--) if(!insub(a,p[i][y])) {sol=min(sol,l[i][y]); y=p[i][y];} sol=min(sol,d[y]); if(!insub(a,b)) sol=min(sol,d[p[0][y]]); return sol; } int main() { int m,za,q,t; scanf("%d%d",&n,&m); for(int i=0;i<m;i++) { int t1,t2,t3; scanf("%d%d%d",&t1,&t2,&t3); g[t1].push_back(t2); g[t2].push_back(t1); c[t1].push_back(t3); c[t2].push_back(t3); } scanf("%d",&za); for(int i=0;i<za;i++) {scanf("%d",&t); z.push_back(t);} simuldij(); for(int i=1;i<=n;i++) arr[i]=dsu[i]=i; fill(vi,vi+n+1,false); sort(arr+1,arr+n+1,cmp); for(int i=1;i<=n;i++) { vi[arr[i]]=true; for(int j=0;j<g[arr[i]].size();j++) if(vi[g[arr[i]][j]] && root(g[arr[i]][j])!=arr[i]) {gt[arr[i]].push_back(root(g[arr[i]][j])); dsu[root(g[arr[i]][j])]=arr[i];} } lcainit(); scanf("%d",&q); for(int i=0;i<q;i++) { int t1,t2; scanf("%d%d",&t1,&t2); printf("%d\n",query(t1,t2)); } }

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

plan.cpp: In function 'void simuldij()':
plan.cpp:19:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<z.size();i++) pq.push(make_pair(0,z[i]));
              ~^~~~~~~~~
plan.cpp:27:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=0;i<g[s].size();i++) pq.push(make_pair(-a-c[s][i],g[s][i]));
               ~^~~~~~~~~~~~
plan.cpp: In function 'void dfs(int, int)':
plan.cpp:35:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<gt[s].size();i++) dfs(gt[s][i],s);
              ~^~~~~~~~~~~~~
plan.cpp: In function 'int main()':
plan.cpp:81:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int j=0;j<g[arr[i]].size();j++) if(vi[g[arr[i]][j]] && root(g[arr[i]][j])!=arr[i]) {gt[arr[i]].push_back(root(g[arr[i]][j])); dsu[root(g[arr[i]][j])]=arr[i];} 
               ~^~~~~~~~~~~~~~~~~
plan.cpp:62:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d",&n,&m);
  ~~~~~^~~~~~~~~~~~~~
plan.cpp:66:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d%d",&t1,&t2,&t3);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~
plan.cpp:72:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d",&za);
  ~~~~~^~~~~~~~~~
plan.cpp:73:30: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for(int i=0;i<za;i++) {scanf("%d",&t); z.push_back(t);}
                         ~~~~~^~~~~~~~~
plan.cpp:84:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d",&q);
  ~~~~~^~~~~~~~~
plan.cpp:88:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d",&t1,&t2);
   ~~~~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...