제출 #102419

#제출 시각아이디문제언어결과실행 시간메모리
102419MohamedAhmed0Dreaming (IOI13_dreaming)C++14
100 / 100
147 ms9900 KiB
#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 ;
}*/

컴파일 시 표준 에러 (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 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...