Submission #245086

#TimeUsernameProblemLanguageResultExecution timeMemory
245086lakshith_Dreaming (IOI13_dreaming)C++14
100 / 100
161 ms10868 KiB
#include <bits/stdc++.h>
#include "dreaming.h"
#define pi pair<int,int>
#define f first
#define s second
#define pb push_back

using namespace std;

int MAX_IN = 1e5;

vector<vector<pair<int,int>>> adjList(100000,vector<pair<int,int>>());
vector<pair<int,int>> centers;
int now = 0;
int dis[100000];
int parent[100000];
int visited[100000];
int dist=0;

void bfs(int node){
    now = node , dist = 0 ;
    queue< pair<int , pair<int , int> > >q ;
    q.push({node , {0 , -2}}) ;
    dis[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 ;
        visited[cur] = 1 ;
        parent[cur] = par ;
        if(d > dist)
            now = cur , dist = d ;
        for(auto &child : adjList[cur])
        {
            if(child.first == par)
                continue;
            dis[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++){
    adjList.at(a[i]).push_back({b[i],t[i]});
    adjList.at(b[i]).push_back({a[i],t[i]});
  }
  for(int i=0;i<n;i++){
    if(visited[i]==1)continue;
//     cout << i << "\n";
    //find the farthest leaf
    bfs(i);
    bfs(now);
//     cout << dist << "\n";
    //only one node
    if(dist==0){centers.pb({0,i});continue;}
    //find the center of the component
    int sum = 0,cur = now,prv=-1;
    for(int j=0;j<n;j++){
      sum += dis[cur];
      prv = cur;
      cur = parent[cur];
      if(sum*2>=dist)break;
    }
    int a = max(sum,dist-sum);
    sum -= dis[prv] ;
    if(max(sum , dist - sum) < a && prv != -1)
        centers.pb({max(sum , dist - sum) , prv}) ;
    else
        centers.pb({a , cur}) ;
//     cout << a << "\n";
  }
  //connect components to make one tree
  sort(centers.rbegin(),centers.rend());
  int v = centers[0].s;
//   cout << v << "\n";
  for(int i=1;i<centers.size();i++){
//     cout  << centers[i].s << "\n";
    adjList.at(v).pb({centers[i].s,l});
    adjList.at(centers[i].s).pb({v,l});
  }
  bfs(0);
  bfs(now);
//   cout << dist << "\n";
  return dist;
}

// int main(){
//   int n=12,m=8,l=2;
//   int a[] = {0,8,2,5,5,1,1,10};
//   int b[] = {8,2,7,11,1,3,9,6};
//   int t[] = {4,2,4,3,7,1,5,3};
//   travelTime(n,m,l,a,b,t);
// }

Compilation message (stderr)

dreaming.cpp: In function 'int travelTime(int, int, int, int*, int*, int*)':
dreaming.cpp:81:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int i=1;i<centers.size();i++){
               ~^~~~~~~~~~~~~~~
#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...