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 <bits/stdc++.h>
using namespace std;
const int MAX = 1e5 + 5 ;
vector< vector< pair<int , int> > >adj(MAX) ;
int vis[MAX] , parent[MAX] , Distance[MAX];
bool t = false ;
int now , dist = 0 ;
void bfs(int node)
{
now = node , dist = 0 ;
queue< pair<int , pair<int , int> > >q ;
q.push({node , {0 , -2}}) ;
Distance[node] = 0 ;
parent[node] = node ;
while(!q.empty())
{
pair<int , pair<int , int> >p = q.front() ;
q.pop() ;
int cur = p.first , d = p.second.first , par = p.second.second ;
vis[cur] = 1 ;
parent[cur] = par ;
if(d > dist)
now = cur , dist = d ;
for(auto &child : adj[cur])
{
if(child.first == par)
continue;
Distance[child.first] = child.second ;
q.push({child.first , {d + child.second , cur}}) ;
}
}
return ;
}
int travelTime(int n , int m , int l , int A[] , int B[] , int T[] )
{
memset(parent , -1 , sizeof(parent)) ;
for(int i = 0 ; i < m ; ++i)
{
int x = A[i] , y = B[i] , c = T[i] ;
adj[x].push_back({y , c}) ;
adj[y].push_back({x , c}) ;
}
vector< pair<int , int> >v ;
//loop on every Tree
for(int i = 0 ; i < n ; ++i)
{
if(vis[i] == 1)
continue ;
//found new Tree
bfs(i) ;
int x = now ;
bfs(now) ;
//one node only
if(dist == 0)
{
v.push_back({0 , i}) ;
continue;
}
int sum = 0 , cur = now , prv = -1 ;
for(int j = 0 ; j < n ; ++j)
{
sum += Distance[cur] ;
prv = cur ;
cur = parent[cur] ;
if(cur == -1)
while(1) ;
if(sum*2 >= dist)
break;
}
int a = max(sum , dist - sum) ;
sum -= Distance[prv] ;
if(max(sum , dist - sum) < a && prv != -1)
v.push_back({max(sum , dist - sum) , prv}) ;
else
v.push_back({a , cur}) ;
}
//connect edges
sort(v.rbegin() , v.rend()) ;
int idx = v[0].second ;
for(int i = 1 ; i < v.size() ; ++i)
{
int idx2 = v[i].second ;
adj[idx].push_back({idx2 , l}) ;
adj[idx2].push_back({idx , l}) ;
}
bfs(0) ;
bfs(now) ;
return dist ;
}
/*int main()
{
int n , m , l ;
cin>>n>>m>>l ;
int a[m] , b[m] , t[m] ;
for(int i = 0 ; i < m ; ++i)
cin>>a[i]>>b[i]>>t[i] ;
cout<<travelTime(n , m , l , a , b , t)<<"\n" ;
return 0 ;
}*/
Compilation message (stderr)
dreaming.cpp: In function 'int travelTime(int, int, int, int*, int*, int*)':
dreaming.cpp:58:13: warning: unused variable 'x' [-Wunused-variable]
int x = now ;
^
dreaming.cpp:87:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i = 1 ; i < v.size() ; ++i)
~~^~~~~~~~~~
# | 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... |