| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 | 
|---|---|---|---|---|---|---|---|
| 1188221 | prideliqueee | 꿈 (IOI13_dreaming) | C++20 | 0 ms | 0 KiB | 
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define f first
#define s second
int up[100010];
int down[100010];
int ans[100010];
int ans1,ans2;
int mx;
vector<pair<int,int>> ad[100010];
void dfs1(int u,int p)
{
    //down[u]=0;
    for(auto x:ad[u])
    {
        if(x.f!=p)
        {
            dfs1(x.f,u);
            down[u]=max(down[u],down[x.f]+x.s);
        }
    }
}
void dfs2(int u,int p)
{
    pair<int,int> mx1={-1,-1},mx2={-1,-1};
    for(auto x:ad[u])
    {
        if(x.f==p)
        continue;
        if(down[x.f]+x.s>=mx1.f)
        {
            mx2=mx1;
            mx1={down[x.f]+x.s,x.f};
        }
        else if(down[x.f]+x.s>mx2.f)
        {
            mx2={down[x.f]+x.s,x.f};
        }
    }
    for(auto x:ad[u])
    {
        if(x.f==p)
        continue;
        up[x.f]=max(up[x.f],up[u]+x.s);
        if(x.f==mx1.s)
        {
            if(mx2.s!=-1)
            up[x.f]=max(up[x.f],mx2.f+x.s);
        }
        else if(mx1.s!=-1)
        {
            up[x.f]=max(up[x.f],mx1.f+x.s);
        }
        dfs2(x.f,u);
    }
    ans[u]=max(down[u],up[u]);
    mx=min(mx,ans[u]);
    //cout<<mx<<" "<<ans[u]<<endl;
}
signed main()
{
    int n,m,l;
    cin>>n>>m>>l;
    ans1=l;
    ans2=0;
    for(int i=0;i<m;i++)
    {
        int u,v,w;
        cin>>u>>v>>w;
        ad[u].push_back({v,w});
        ad[v].push_back({u,w});
    }
    for(int i=0;i<n;i++)
    {
        if(ans[i]==0)
        {
            mx=INT_MAX;
            dfs1(i,-1);
            dfs2(i,-1);
            if(mx>ans1)
            {
                ans2=ans1;
                ans1=mx;
            }
            else if(mx>ans2)
            {
                ans2=mx;
            }
        }
    }
    cout<<ans1+ans2+l;
}
