title

树的直径

跑两遍dfs

#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
const int N =100010;
const int inf =1e9+7;
struct edge{
	int to,nxt,w;
}e[N];
int head[N],tot,vis[N],dis[N],n,maxn,u=1;
inline int read(){
	int f=0,x=0;
	char ch=getchar();
	while(!isdigit(ch)) f|=(ch=='-'),ch=getchar();
	while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return f?-x:x;
}
inline void init(int u){
	for(int i=1;i<=n;++i){
		if(i==u)	dis[i]=0;
		else	dis[i]=inf;
	}
	memset(vis,0,sizeof(vis));
	maxn=-1;
}
inline void add(int u,int v,int w){
	e[++tot].to=v;
	e[tot].nxt=head[u];
	head[u]=tot;
	e[tot].w=w;
}
inline void dfs(int u){
	vis[u]=1;
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].to;
		if(!vis[v]){
			dis[v]=dis[u]+e[i].w;
			dfs(v);
		}
	}
}
signed main(){
	n=read();
	for(int i=1;i<=n;++i){
		int u=read(),v=read(),w=read();
		add(u,v,w);add(v,u,w);
	}
	
	init(u);
	dfs(u);
	for(int i=1;i<=n;++i)
		if(dis[i]!=inf){
			maxn=max(maxn,dis[i]);
			u=i;
		}
	
	init(u);
	dfs(u);
	for(int i=1;i<=n;++i)
		if(dis[i]!=inf)
			maxn=max(maxn,dis[i]);
	
	printf("%d\n",maxn);
	return 0;
}
posted @ 2018-09-10 01:08  Horrigue_JyowYang  阅读(106)  评论(0编辑  收藏  举报