复制代码

树中的最长路

 

传送门

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;



}
View Code

 

posted @ 2018-03-11 17:07  pg633  阅读(125)  评论(0编辑  收藏  举报