-->http://www.lydsy.com/JudgeOnline/problem.php?id=2657
嘛,两个三角形最多只有一条公共边-。-,然后以每个三角形为顶点与相邻的三角形连边,这样构成一棵树。。然后跑直径就好了
$O(N)$
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<map>
using namespace std;
#define nc() getchar()
inline int read(){
int x=0;char ch=nc();for(;ch<'0'||ch>'9';ch=nc());
for(;ch<='9'&&ch>='0';x=x*10+ch-48,ch=nc());return x;
}
#define N 200010
int i,j,k,m,n,x,y,cnt,last[N],z,who,dep[N],Dep;
struct edge{int to,next;}e[N<<1];
inline void add(int u,int v){e[++cnt]=(edge){v,last[u]},last[u]=cnt,e[++cnt]=(edge){u,last[v]},last[v]=cnt;}
struct Edge{int l,r;bool operator <(const Edge&b)const{return(l<b.l)||(l==b.l)&&(r<b.r);}};
map<Edge,int>mp;
void dfs(int x,int fa){
dep[x]=dep[fa]+1;
for(int i=last[x],y;i;i=e[i].next)if((y=e[i].to)!=fa)dfs(y,x);
if(Dep<dep[x])Dep=dep[x],who=x;
}
inline void Add(int x,int y){
if(mp[(Edge){x,y}]!=0)add(mp[(Edge){x,y}],i),mp[(Edge){x,y}]=0,mp[(Edge){y,x}]=0;
else mp[(Edge){x,y}]=i,mp[(Edge){y,x}]=i;
}
int main(){
for(n=read(),i=1;i<n-1;++i){
x=read(),y=read(),z=read();
Add(x,y),Add(x,z),Add(y,z);
}
dfs(1,0),Dep=0,dep[0]=0,dfs(who,0);
printf("%d",Dep);
}