树的直径以及模板

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43872728/article/details/98970357

模板:

int dis[100020];
int vist[100020];
vector<pair<int,int> > v[100020];
int m,n,ans;
int bfs(int x)
{
    memset(dis,0,sizeof dis);
    memset(vist,0,sizeof vist);
    queue<int> q;
    int h=x,point=0;
    q.push(x);
    vist[x]=1;
    ans=0;
    while(!q.empty())
    {
        h=q.front();
        q.pop();
        if(dis[h]>ans)
        {
            ans=dis[h];
            point=h;
        }
        pair<int,int> n;
        for(int i=0;i<v[h].size();i++)
        {
            n=v[h][i];
            if(vist[n.first]==0)
            {
                vist[n.first]=1;
                dis[n.first]=dis[h]+n.second;
                q.push(n.first);
            }
        }
    }
    return point;
}
int main()
{
    int x,y,z;
    char d;
    scanf("%d %d",&m,&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d %d %d %c",&x,&y,&z,&d);
        v[x].push_back(make_pair(y,z));//存图
        v[y].push_back(make_pair(x,z));
    }
    ans=0;
    int point=bfs(1);//第一次dfs找到最远的点
    ans=0;
    bfs(point);
    printf("%d",ans);//第二次dfs从最远的点到另一个最远的点所走的距离就是树的直径
    return 0;
}

展开阅读全文

没有更多推荐了,返回首页