Submission #167389

#TimeUsernameProblemLanguageResultExecution timeMemory
167389DavidDamianDreaming (IOI13_dreaming)C++11
47 / 100
105 ms12644 KiB
#include "dreaming.h"
#include<queue>
#include<vector>
#include<iostream>
using namespace std;
///Diameter of a tree
///Determine the minimum longest path selecting optimal connections
struct edge
{
    int from,to;
    int w;
};
int color[100005];
int d[2][100005]; //Distance from node 1 and node 2
queue<int> Q;
vector<edge> adjList[100005];
int bfs(int s,int node,int c) ///Returns the farest node of s
{
    color[s]=c;
    d[node][s]=0;
    Q.push(s);
    int maximum=0;
    int max_Node=s;
    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[node][v]=d[node][u]+e.w;
                if(d[node][v]>maximum){
                    maximum=d[node][v];
                    max_Node=v;
                }
                Q.push(v);
            }
        }
    }
    return max_Node;
}
int getMinimum_FarestDistance(int s,int c) ///Returns the minimum longest distance in a tree
{
    color[s]=c;
    Q.push(s);
    int minimum=1000000000;
    while(Q.size()){
        int u=Q.front();Q.pop();
        if(max(d[0][u],d[1][u]) < minimum){
            minimum=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 minimum;
}
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[ A[i] ].push_back(e);
        swap(e.from,e.to);
        adjList[ B[i] ].push_back(e);
    }
    int c=1;
    int best[5];
    int j=0;
    int answer=0;
    for(int i=0;i<N;i++){
        if(color[i]!=0) continue;
        int u=bfs(i,0,c++); //Gets the farest node of i
        int v=bfs(u,1,c++); //Gets the farest node of u
        //u and v are the farest nodes between themselves in the tree
        answer=max(answer,d[1][v]);
        bfs(v,0,c++);
        best[j++]=getMinimum_FarestDistance(i,c);
    }
    int NewPath=best[0]+best[1]+L;
    answer=max(answer,NewPath);
    return answer;
}
#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...