0分求助!
查看原帖
0分求助!
891606
2023gdgz01楼主2023/11/4 12:03

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;
}
2023/11/4 12:03
加载中...