Rt.
全WA
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct edge
{
int next, to;
long long w;
};
int n, m, x, y, cur, head[200005], depth[200005];
long long z, ans, dis1[200005], dis2[200005];
edge e[1000005];
inline void add(int x, int y, long long z) //链式前向星插入边
{
++cur;
e[cur] = {head[x], y, z};
head[x] = cur;
}
void getdepth(int u, int fa) //意义同函数名
{
depth[u] = depth[fa] + 1;
for (register int i = head[u]; i; i = e[i].next)
{
if (fa != e[i].to)
{
getdepth(e[i].to, u);
}
}
}
void dfs1(int u, int fa)
{
for (register int i = head[u]; i; i = e[i].next)
{
if (fa != e[i].to)
{
dis1[e[i].to] = dis1[u] + e[i].w;
dfs1(e[i].to, u);
}
}
}
void dfs2(int u, int fa)
{
for (register int i = head[u]; i; i = e[i].next)
{
if (fa != e[i].to)
{
dis2[e[i].to] = dis2[u] + e[i].w;
dfs2(e[i].to, u);
}
}
}
//两个dfs分别求x和y到其它点的距离
int main()
{
scanf("%d%d", &n, &m);
while (m--)
{
scanf("%d%d%lld", &x, &y, &z);
add(x, y, z);
add(y, x, z);//无根树,建反边
}
getdepth(1, 0);
x = max_element(depth + 1, depth + n + 1) - depth;
memset(depth, 0, sizeof(depth));
getdepth(x, 0);
y = max_element(depth + 1, depth + n + 1) - depth;
//计算出树中最长链
z = depth[y];
dfs1(x, 0);
dfs2(y, 0);
for (register int i = 1; i <= n; ++i)
{
ans = max(ans, min(dis1[i], dis2[i]));
}
printf("%lld", ans + z);
return 0;
}