제출 #1327806

#제출 시각아이디문제언어결과실행 시간메모리
1327806lucasdmy꿈 (IOI13_dreaming)C++20
100 / 100
56 ms22060 KiB
#include "dreaming.h"
#include <bits/stdc++.h>
using namespace std;
const int MAXN=1e5+10, INF=1e9+7;
vector<int>v[MAXN], w[MAXN], marc(MAXN, 0), d1(MAXN, 0), d2(MAXN, 0), d3(MAXN, 0), dt(MAXN, 0);
int radius, diameter, center;
void dfs(int x, int p){
    marc[x]=1;
    for(int k=0;k<v[x].size();k++){
        if(v[x][k]!=p){
            dfs(v[x][k], x);
            if(d1[v[x][k]]+w[x][k]>d1[x]){
                d2[x]=d1[x];
                d1[x]=d1[v[x][k]]+w[x][k];
            }else if(d1[v[x][k]]+w[x][k]>d2[x]){
                d2[x]=d1[v[x][k]]+w[x][k];
            }
        }else{
            swap(v[x][k], v[x][0]);
            swap(w[x][k], w[x][0]);
        }
    }
}
void solve(int x, int p){
    if(p!=-1){
        if(d1[p]==d1[x]+w[x][0]){
            d3[x]=max(d2[p], d3[p])+w[x][0];
        }else{
            d3[x]=max(d1[p], d3[p])+w[x][0];
        }
    }else if(v[x].size()!=0){
        solve(v[x][0], x);
    }
    for(int k=1;k<v[x].size();k++){
        solve(v[x][k], x);
    }
    int aux1=d1[x], aux2=d2[x], aux3=d3[x];
    dt[x]=max({d1[x], d2[x], d3[x]});
    if(dt[x]<radius){
        center=x;
        radius=dt[x];
        diameter=max(d3[x], d2[x])+d1[x];
    }
}
int travelTime(int n, int m, int l, int a[], int b[], int t[]){
    for(int k=0;k<m;k++){
        v[a[k]].push_back(b[k]);
        v[b[k]].push_back(a[k]);
        w[a[k]].push_back(t[k]);
        w[b[k]].push_back(t[k]);
    }
    int resp=0, r1=-1, r2=-1, r3=-1;
    for(int k=0;k<n;k++){
        if(marc[k]==0){
            radius=INF;
            diameter=INF;
            dfs(k, -1);
            solve(k, -1);
            resp=max(resp, diameter);
            if(r1<radius){
                r3=r2;
                r2=r1;
                r1=radius;
            }else if(r2<radius){
                r3=r2;
                r2=radius;
            }else if(r3<radius){
                r3=radius;
            }
        }
    }
    if(n-1>m){
        resp=max(resp, r1+r2+l);
    }
    if(n-2>m){
        resp=max(resp, r2+r3+2*l);
    }
    return resp;
}
/*int main(){
    int n, m, l;
    cin>>n>>m>>l;
    int a[m], b[m], t[m];
    for(int k=0;k<m;k++){
        cin>>a[k]>>b[k]>>t[k];
    }
    cout<<travelTime(n, m, l, a, b, t);
}*/
#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...