单源最短路——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;
            }
    }

 

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

posted @ 2019-04-10 16:42  Mmasker  阅读(285)  评论(0编辑  收藏  举报