This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "dreaming.h"
#include<vector>
#include<queue>
#include<algorithm>
#include<iostream>
using namespace std;
bool byGreater(int a,int b)
{
return a>b;
}
struct edge
{
int from,to;
int w;
};
vector<edge> adjList[100005];
int Far[100005]; //Stores the minimum longest distance for each tree
int color[100005];
int d[2][100005];
queue<int> Q;
int bfs(int s,int op,int c)
{
color[s]=c;
d[op][s]=0;
Q.push(s);
int farthest_node;
int maximum=0;
while(Q.size()){
int u=Q.front();Q.pop();
for(edge e: adjList[u]){
int v=e.to;
if(color[v]!=c){
color[v]=c;
d[op][v]=d[op][u]+e.w;
if(d[op][v]>maximum){
maximum=d[op][v];
farthest_node=v;
}
Q.push(v);
}
}
}
return farthest_node;
}
int getOptimumDistance(int s,int c)
{
color[s]=c;
int minimumD=1000000000;
Q.push(s);
while(Q.size()){
int u=Q.front();Q.pop();
if(max(d[0][u],d[1][u])<minimumD){
minimumD=max(d[0][u],d[1][u]);
}
for(edge e: adjList[u]){
int v=e.to;
if(color[v]!=c){
color[v]=c;
Q.push(v);
}
}
}
return minimumD;
}
int far[5];
int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
for(int i=0;i<M;i++){
edge e={A[i],B[i],T[i]};
adjList[e.from].push_back(e);
swap(e.from,e.to);
adjList[e.from].push_back(e);
}
int answer=0;
int max_diameter=0;
int c=1;
int trees=0;
for(int u=0;u<N;u++){
if(color[u]!=0) continue;
int a=bfs(u,1,c++);
int b=bfs(a,0,c++);
bfs(b,1,c++);
max_diameter=max(max_diameter,d[1][a]);
Far[trees++]=getOptimumDistance(u,c++);
}
for(int i=0;i<trees+1;i++){
if(Far[i]>far[0] || Far[i]>far[1] || Far[i]>far[2]){
far[3]=Far[i];
sort(far,far+4,byGreater);
}
}
cout<<far[0]<<" "<<far[1]<<" "<<far[2]<<endl;
if(trees==1){
answer=max_diameter;
}
else if(trees==2){
answer=max(max_diameter,far[0]+L+far[1]); //Path joining yourself with another tree
}
else{
answer=max(max_diameter,
max(far[0]+L+far[1],far[1]+L+L+far[2])); //Path joining yourself with another tree
//and joining other two trees whose path passes for you
}
return answer;
}
Compilation message (stderr)
dreaming.cpp: In function 'int bfs(int, int, int)':
dreaming.cpp:43:12: warning: 'farthest_node' may be used uninitialized in this function [-Wmaybe-uninitialized]
return farthest_node;
^~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |