U81904 【模板】树的直径 九十分模板 why
  • 板块学术版
  • 楼主qwq2519
  • 当前回复2
  • 已保存回复2
  • 发布时间2020/9/13 20:45
  • 上次更新2023/11/5 13:13:48
查看原帖
U81904 【模板】树的直径 九十分模板 why
141335
qwq2519楼主2020/9/13 20:45

有一组是答案错误 是树的直径搜索模板

#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i(j);i!=(k+1);++i)
using namespace std;
const int N=500007;
int u[N],ver[N],head[N],next[N],ans[N],edge[N],best,onev,firstv,secondv,tot;
int stmin[N][50],stmax[N][50];
void addedge(int x,int y,int z) {
	ver[++tot]=y;
	next[tot]=head[x];
	head[x]=tot;
	edge[tot]=z;
}

void dfs_v(int vv,int maxl,int fath) {
	if (maxl>u[vv])
		u[vv]=maxl;
	for(register int i(head[vv]); i; i=next[i]) {
		int y=ver[i];
		if(fath==y) continue;
		dfs_v(y,maxl+edge[i],vv);
	}

}
int n,m;
void dfs_ans(int vv,int maxl,int fath) {
	if (maxl>ans[vv]) ans[vv]=maxl;
	for(register int i(head[vv]); i; i=next[i]) {
		int y=ver[i];
		if(fath==y) continue;
		dfs_v(y,maxl+edge[i],vv);
	}
}

inline void read(int &x) {
	x=0;
	register char ch=getchar();
	int w=0;
	while(ch>'9'||ch<'0') {
		w|=ch=='-';
		ch=getchar();
	}
	while(ch>='0'&&ch<='9') {
		x=(x<<1)+(x<<3)+(ch&15);
		ch=getchar();
	}
	w?x=~(x-1):x;
}

inline void init() {
	rep(i,1,n) stmin[i][0] =stmax[i][0]=ans[i];
	for (int j = 1; (1 << j) <= n; j++)
		for (int i = 1; i + (1 << j) - 1 <= n; i++) {
			stmin[i][j]=min(stmin[i][j-1],stmin[i+(1<<(j-1))][j-1]);
			stmax[i][j]=max(stmin[i][j-1],stmax[i+(1<<(j-1))][j-1]);
		}
}
inline int qmax(int l, int r) {
	int k = log2(r - l + 1);
	int x = stmax[l][k], y = stmax[r - (1 << k) + 1][k];
	return x > y ? x : y;
}
inline int qmin(int l, int r) {
	int k = log2(r - l + 1);
	int x = stmin[l][k], y = stmin[r - (1 << k) + 1][k];
	return x < y ? x : y;
}



int main() {
//	freopen("d.in","r",stdin);
//	freopen("d.out","w",stdout);
	read(n);
//	read(m);
	rep(i,2,n) {

		int x,y,z;
		read(x);
		read(y);
		read(z);
		addedge(x,y,z);
		addedge(y,x,z);

//		int j,k;
//		read(j);
//		read(k);
//		addedge(j,i,k);
//		addedge(i,j,k);
	}

	best=0;
	dfs_v(1,0,0);

	int maxx=-2146465;
	rep(i,1,n) {
		if(maxx<u[i]) {
			maxx=u[i];
			onev=i;
		}
	}
	firstv=onev;
	
	memset(u,0,sizeof u);
	dfs_v(firstv,0,0);
	
	
	 maxx=-2146465;
	rep(i,1,n) {
		if(maxx<u[i]) {
			maxx=u[i];
		}
	}
	cout<<maxx;
//	rep(i,1,n)
//	secondv=onev;

//	dfs_ans(firstv,0,0);
//	dfs_ans(secondv,0,0);
//	init();
//
//	int h=1;
//    int ans=-1;
//    for(int i=1;i<=n;i++)
//    {
//        while(qmax(h,i)-qmin(h,i)>m) h++;
//        ans=max(ans,i-h+1);
//    }
//
//	cout<<ans;
}
2020/9/13 20:45
加载中...