zoukankan      html  css  js  c++  java
  • LCA最近公共祖先(least common ancestors)

    #include"stdio.h"
    #include"string.h"
    #include"iostream"
    #include"queue"
    #define M 111111
    using namespace std;
    struct st
    {
        int u,v,next,w;
    }edge[M*2];
    int rank[M],head[M],t,pre[M],use[M],dis[M];
    void init()
    {
        t=0;
        memset(head,-1,sizeof(head));
    }
    void add(int a,int b,int w)
    {
        edge[t].u=a;
        edge[t].v=b;
        edge[t].w=w;
        edge[t].next=head[a];
        head[a]=t++;
    }
    void bfs(int s)
    {
        queue<int>q;
        memset(use,0,sizeof(use));
        memset(rank,0,sizeof(rank));
        use[s]=1;
        q.push(s);
        while(!q.empty())
        {
            int u=q.front();
            q.pop();
            for(int i=head[u];i!=-1;i=edge[i].next)
            {
                int v=edge[i].v;
                if(!use[v])
                {
                    use[v]=1;
                    rank[v]=rank[u]+1;
                    pre[v]=u;
                    dis[v]=edge[i].w;
                    q.push(v);
                }
            }
        }
    }//用bfs对点进行分层
    int targan(int a,int b)
    {
        int sum=0;
        while(a!=b)
        {
            if(rank[a]>rank[b])
            {
                sum+=dis[a];
                a=pre[a];
            }
            else
            {
                sum+=dis[b];
                b=pre[b];
            }
        }
        return sum;
    }//查找
    /*int targan(int a,int b)
    {
        if(a==b)
            return a;
        else if(rank[a]>rank[b])
            return targan(pre[a],b);
        else
            return targan(a,pre[b]);
    }*/深搜写法
    
    int main()
    {
        int n,m,a,i,b,c;
        while(scanf("%d%d",&n,&m)!=-1)
        {
            init();
            while(m--)
            {
                scanf("%d%d%d",&a,&b,&c);
                add(a,b,c);
                add(b,a,c);
            }
            bfs(1);
            for(i=1;i<=n;i++)
                printf("%d ",rank[i]);
            while(scanf("%d%d",&a,&b)!=-1)
            {
                int ans=targan(a,b);
                printf("%d
    ",ans);
            }
        }
    }


  • 相关阅读:
    保存全局Crash报告&发送邮件
    手机端抓包方法
    apk反编译
    保存全局Crash报告
    一个android控件资源网站
    扩展RBAC用户角色权限设计方案
    剑指offer分块总结----------数组
    剑指offer-----合并两个排序的链表
    剑指offer-----单链表反转
    python实现输入一段英文单词后,倒叙输出
  • 原文地址:https://www.cnblogs.com/mypsq/p/4348265.html
Copyright © 2011-2022 走看看