树中的最长路
bfs 大法
#include<bits/stdc++.h> using namespace std; #define LOACL freopen("in","r",stdin);\ freopen("out","w",stdout); typedef long long ll; #define f(i,l,r) for(int i=l;i<=r;++i) #define g(i,l,r) for(int i=l;i>=r;--i) #define CLR(arr,val) memset(arr,val,sizeof(arr)) //#define add(u,v) (e[++tot]=(edge){u,head[u],1},head[u]=tot) struct edge{ int v,nxt,w; }e[1<<18]; bool vis[1<<18]; int dis[1<<18]; int head[1<<18]; int n,tot,u,v,mst; int maxd,max_num; void add(int u,int v ) { e[++tot]=(edge){v,head[u],1},head[u]=tot; // e[++tot]=(edge){u,head[v],w},head[v]=tot; } void bfs(int st ) { CLR(vis,false); CLR(dis,0); queue<int> q ; q.push(st); vis[st]=true; maxd=0; while(!q.empty()) { int t = q.front(); q.pop(); for(int i = head[t];i!=-1 ;i=e[i].nxt) { int v = e[i].v; if(!vis[v]) { vis[v]=true; dis[v]=dis[t]+e[i].w; if(dis[v] > maxd ) { maxd = dis[v] ; max_num =v; } q.push(v); } } } } int main() { cin>>n; CLR(head,-1); for(int i = 0;i<n;i++) { cin>>u>>v; add(u,v); add(v,u); } bfs(1); mst=max_num; bfs(mst); cout<<maxd<<endl; }
不摸着石头过河,难道要在温柔乡睡到天昏地暗。