Submission #1182566

#TimeUsernameProblemLanguageResultExecution timeMemory
1182566Joon_YorigamiDreaming (IOI13_dreaming)C++20
100 / 100
75 ms9032 KiB
#include "dreaming.h" #include <bits/stdc++.h> using namespace std; #define ll int int travelTime(int n, int m, int l, int a[], int b[], int t[]) { using pii = pair<ll, ll>; vector<vector<pair<ll,ll>>> neighbours(n,vector<pair<ll,ll>>()); ll w,x,y,z; for(int i=0;i<m;i++) { x=a[i]; y=b[i]; z=t[i]; neighbours[x].push_back(make_pair(y,z)); neighbours[y].push_back(make_pair(x,z)); } vector<bool> seen(n,false); vector<bool> currseen(n,false); vector<ll> temparr; vector<ll> path(n,-1); vector<ll> firstpassweight(n,-1); vector<ll> weight(n,-1); ll neighbour,edgeweight; ll d,r1,r2,r3; d=0;r1=0;r2=0;r3=0; for(int i=0;i<n;i++) { if(!seen[i]) { stack<ll> q({i}); ll ep1,ep2,curr,total,currfurthest,currfurthestdistance; firstpassweight[i]=0; currfurthestdistance=-1; ep1=i; while(!q.empty()) { curr = q.top(); q.pop(); seen[curr]=true; for(auto &pa:neighbours[curr]) { neighbour=pa.first; edgeweight=pa.second; if(!seen[neighbour]) { firstpassweight[neighbour]=firstpassweight[curr]+edgeweight; if(firstpassweight[neighbour]>currfurthestdistance) { currfurthestdistance=firstpassweight[neighbour]; ep1=neighbour; } q.push(neighbour); } } } ep2=ep1; currfurthestdistance=-1; total=0; weight[ep1]=0; stack<ll>({ep1}).swap(q); while(!q.empty()) { curr = q.top(); q.pop(); currseen[curr]=true; for(auto &pa:neighbours[curr]) { neighbour=pa.first; edgeweight=pa.second; if(!currseen[neighbour]) { path[neighbour]=curr; weight[neighbour]=weight[curr]+edgeweight; if(weight[neighbour]>currfurthestdistance) { currfurthestdistance=weight[neighbour]; ep2=neighbour; } q.push(neighbour); } } } ll a,b; x=max(weight[ep1],weight[ep2]-weight[ep1]); y=min(weight[ep1],weight[ep2]-weight[ep1]); ll p1=ep2; while(p1!=ep1) { a=max(weight[p1],weight[ep2]-weight[p1]); b=min(weight[p1],weight[ep2]-weight[p1]); if(a<x) { x=a; y=b; } p1=path[p1]; } vector<ll>({r1,r2,r3,x}).swap(temparr); sort(temparr.begin(),temparr.end()); r1=temparr[3]; r2=temparr[2]; r3=temparr[1]; d=max(d,weight[ep2]); } } if(m==n-1) { return d; } if(m==n-2) { return max(d,r1+r2+l); } else { return max(max(d,r1+r2+l),r2+r3+2*l); } } /* int main() { int n,m,l,k; cin >> n >> m >> l; int a[n]; int b[n]; int t[n]; for(int i=0;i<n;i++) { cin >> k; a[i] = k; cin >> k; b[i] = k; cin >> k; t[i] = k; } //cout << "owo" << endl; cout << travelTime(n,m,l,a,b,t) << endl; } */
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...