# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1188222 | prideliqueee | 꿈 (IOI13_dreaming) | C++20 | 0 ms | 0 KiB |
#include<bits/stdc++.h>
#include "dreaming.h"
using namespace std;
#define int long long
#define f first
#define s second
int up[100010];
int down[100010];
int ans[100010];
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()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
int n,m,l;
cin>>n>>m>>l;
int ans1,ans2;
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;
}