(萌新)只写了个求直径的,求调
查看原帖
(萌新)只写了个求直径的,求调
1389794
Lei_ZT楼主2024/7/24 11:29
#include<bits/stdc++.h>
using namespace std;
long long n,lmax,pmax,bmax;//lmax=当前最长路径,pmax=当前最长路径所到达的终点,bmax=最长路径中的最后一条边 
//n=总节点个数,所以边的个数为(n-1) 
struct tree{
	int to,nex,val;//val=每条边的长度 
}tb[200010];
void dfs(int dq,int len,int zt){
	if(zt==1){//第一次查找时 
		for(int i=1;i<n;i++){//遍历n-1条边 
				if(tb[dq].to==tb[i].nex){
					if(lmax<len+tb[i].val){
						lmax=len+tb[i].val;
						pmax=tb[i].to;
						bmax=i;
					}
					dfs(i,len+tb[i].val,1);
				}
		}
	}
	else{//第二次查找时 
		for(int i=n;i<=(n-1)*2;i++){//遍历n-1条边
			if(tb[dq].to==tb[i].nex){
				if(lmax<len+tb[i].val){
					lmax=len+tb[i].val;
					pmax=tb[i].to;
					bmax=i;
				}
				dfs(i,len+tb[i].val,2);
			}
		}
	}
}
int main(){
	cin>>n;
	for(int i=1;i<n;i++){
		cin>>tb[i].nex>>tb[i].to>>tb[i].val;
		tb[i+n-1].nex=tb[i].to;
		tb[i+n-1].to=tb[i].nex;
		tb[i+n-1].val=tb[i].val;
	}
	for(int i=n;i<=(n-1)*2;i++)
		cout<<tb[i].nex<<" "<<tb[i].to<<" "<<tb[i].val<<endl;
	pmax=1;
	//lmax=tb[1].val;
	dfs(1,tb[1].val,1);	
	lmax=0;
	dfs(bmax,tb[bmax+n-1].val,2);
	cout<<lmax<<" "<<pmax<<" "<<bmax;
	return 0;
}
2024/7/24 11:29
加载中...