树的直径,两次dfs模板
  • 板块学术版
  • 楼主c_legg
  • 当前回复5
  • 已保存回复5
  • 发布时间2024/10/5 20:45
  • 上次更新2024/10/5 21:25:41
查看原帖
树的直径,两次dfs模板
1054383
c_legg楼主2024/10/5 20:45

先放代码:

struct edge{
	vector<int> w, n;
}e[10001];

int d[10001];

void dfs(int now, int &p, int fat) {
	for(int x=0; x<e[now].n.size(); x++) { //遍历每一个节点
		int i=e[now].n[x];
		if(i==fat) continue; //避免重复访问节点
		d[i]=d[now]+e[now].w[x]; //该点到起点的距离=上一个节点到起点的距离+上一个节点到该点的距离
		if(d[i]>d[p]) p=i; //找到了大于当前最大指的值,更新它
		dfs(i, p, now);
	}
}

// ...

dfs(0, p, 0); //第一遍dfs,从任意节点出发
d[p]=0;
dfs(p, p, 0); //第二遍dfs,从上次到达的最远点出发
cout<<d[p];

这里,ee数组存放树中的边,对于任一iie[i]e[i]中个变量意义如下:

{i  边的起点e[i].n[j]  边的终点e[i].w[j]  该边(ie[i].n[j])的权值\begin{cases} i & \ \ 边的起点 \\\\ e[i].n[j] & \ \ 边的终点 \\\\ e[i].w[j] & \ \ 该边(i\to e[i].n[j])的权值 \end{cases}

其他可看代码注释

相关理论证明:

oi-wiki.org

2024/10/5 20:45
加载中...