迪杰斯特拉算法(Dijkstra算法)

迪杰斯特拉算法(Dijkstra算法)

算法介绍

  • 算法特点:

    迪科斯彻算法使用了广度优先搜索解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树。该算法常用于路由算法或者作为其他图算法的一个子模块。

  • 算法思路:
    直接—盗图
    在这里插入图片描述
    1.简介:从起点出发,一次遍历与起点相连的每个点,更新他们与起点的距离,如图,1 和 6 的距离变成 14,与 3 的距离变成 9;然后选择一个与起点最短的点去,再去更新与之相邻的点,这样每次都是最优解,所以每个点都遍历完之后,每个点上的数值就是与起点最短的距离,建议看图理解;
    (时间复杂度为O(n^2))

直接上代码

#include<iostream>
#include <cstdio>

#include <cstring>
#include <algorithm>
#include <map>
#include <string>
typedef long long ll;
using namespace std;
const int maxn=1e6+5;
const int INF=1e9;
struct node{
    int e;//记录可以到达地址
    int w;//到达e的距离或者时间
    int next;//储存下一个地址
}edge[maxn];
int head[maxn];//头指针数组
ll cnt=0;//记录指针后移
int dis[maxn];
int vis[maxn];
void addedge(int u,int v,int w)
{
    edge[cnt].e=v;//u->v;
    edge[cnt].w=w;
    edge[cnt].next=head[u];//把这一组数据放到u后面;
    head[u]=cnt++;
}
void restart()
{
    memset(head,-1,sizeof(head));
    cnt=0;//多组输入中这个而一定要加;
}
void Dijkstra(int n)
{
    //这个地方一定要注意点的范围,如果包括0,i需要从0开始。
    for(int i=1;i<=n;i++) dis[i]=INF,vis[i]=0;//对dis数组进行赋予最大值,方便更新。
    dis[1]=0;    //起点赋予0,从起点开始;标记过就确定最小距离,不在更新标记为1.
    while(1)
    {
        int k=-1;int len=INF;
        for(int i=1;i<=n;i++)
        {
            if(!vis[i]&&len>dis[i])
            {
                len=dis[i];
                k=i;//擂台法比较出当前与起点距离最小的点。
            }
        }
        if(k==-1) break;//找不到点,全部遍历完,结束。
        vis[k]=1;
        for(int i=head[k];i!=-1;i=edge[i].next)//该处使用的链式前向星访问
        {
            int u=edge[i].e;
            if(!vis[u]&&dis[u]>len+edge[i].w)
                dis[u]=len+edge[i].w;
        }
    }
}
int main()
{
    ll m,n;
    while(scanf("%lld%lld",&m,&n)&&m&&n)
    {
        restart();//一定不要忘记初始化!
        ll maxx=0;
        for(int i=1;i<=n;i++)
        {
            ll u,v,w;
            scanf("%lld%lld%lld",&u,&v,&w);
            addedge(u,v,w);
            addedge(v,u,w);
            ll a=max(u,v);
            maxx=max(maxx,a);//记录最大能到达的点,以便于可以全部遍历。
        }
        Dijkstra(maxx);
        printf("%d\n",dis[m]);
    }

    return 0;
}

事发突然。这个周在冲忙之中,还没适应这样的单独自己一个人写这些东西,无从下手,我觉得整理这些知识不在于多,而是在于自己理解了,才能写出来,不然一味的为了交作业而应的话,丝毫没有意义,下次我会努力 的不上没有完成的东西。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值