zoukankan      html  css  js  c++  java
  • 单源最短路——dijkstra算法

    在这里插入图片描述
    首先我们应该考虑的是如何将这个图中的每条有向边表示出来
    刚开始大家肯定都会想到用二维数组,用坐标来写两个点间的距离,但这会造成时间和空间的巨大浪费,因此,我们就需要新型高效的方法来储存这些有向边——
    1.链式前向星

    struct edge 
    { 
        int next;
        int to;
        int val;
    }a[maxn];
    int head[maxn];//head[i]为i点的第一条边
    int cnt=0;
    void addedge(int u,int v,int w) //起点,终点,权值 
    {
        a[++cnt].next=head[u];//更新cnt
        a[cnt].to=v;
        a[cnt].w=w;
        head[u]=cnt;
    }
    int main()
    {
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            int x,y,z;
            cin>>x>>y>>z;
            addedge(x,y,z);
            //如果是无向图,还要addedge(b,a,wei);
        }
    }

    在得到每条有向(无向)边后,接下来就要开始遍历了,在遍历以x为起点的所有边时,只需要这样就行:

    for(int i=head[pos];i!=0;i=a[i].next)

    下面贴上遍历的代码:

    //这里我们需要在全局变量里定义ans[maxn],用来记录源点到每个点的最短路程
        int pos=s;
        while(vis[pos]==0){
            ll minn=inf;
            vis[pos]=1;
            for(int i=head[pos];i!=0;i=a[i].next){
                if(vis[a[i].to]!=1&&ans[a[i].to]>ans[pos]+a[i].val)
                    ans[a[i].to]=ans[pos]+a[i].val;
            }
            for(int i=1;i<=n;i++)
                if(ans[i]<minn&&vis[i]==0){
                    minn=ans[i];
                    pos=i;
                }
        }

    最后输出你所需要位置的值即可。

    希望用自己的努力为自己赢得荣誉。
  • 相关阅读:
    Linux 下杀毒可用工具 clamav
    Docker 添加环境系统文件配置
    Docker 空间大小设置
    Docker 扩容 容器空间大小
    bzoj 1088 DP
    bzoj 1096 斜率优化DP
    spoj p104 Matrix-Tree定理
    bzoj 1016 深搜
    WC后记
    bzoj 1301 后缀数组
  • 原文地址:https://www.cnblogs.com/Mmasker/p/11917490.html
Copyright © 2011-2022 走看看