理解最短路径——迪杰斯特拉(dijkstra)算法

原文链接:http://ibupu.link/?id=29


/* 大家可以先看大神的理论知识,将dijkstra思想搞懂,然后在 来看我举得简单的例子 */

输入输出


输入:
v e
e行 ,每行表示俩个节点相连的边的长度
输出:
节点1的单源最短路径
input:
6 9
1 2 7
1 3 9
1 6 14
2 3 10
2 4 15
3 4 11
3 6 2
4 5 6
5 6 9
output:
0 7 9 20 20 11
大神里面的那个图的例子


代码实现


#include<iostream>
#include<cstring>
using namespace std;
const int MAXN = 100;
const int INF = 10000;
int w[MAXN][MAXN]; //存图,相连节点之间的边 ,无边初始化为最大值 
int vis[MAXN]; //标记节点是否使用过 
int dis[MAXN]; //存起点到终点的最短路径数组 

void dijkstra(int n)
{ 
    //n节点的个数,节点为1--n
    //这里假设求 起点为节点1到其他节点的最短路径
    //分为俩个区域,更新过的区域x,未更新的区域y
    //将节点1加入x 
    //第一步,初始化dis数组,并且标记节点1为1.用过 
    for(int i=2; i<=n; ++i)
        dis[i] = w[1][i];     
    vis[1] = 1;
    //第二步,依次找个节点加入x,更新x,y区域 
    for(int i=2; i<=n; ++i)
    {
        int MIN = INF, k;
        //找与节点1有边相连的最短节点记为k,最短记为MIN 
        for(int j=1; j<=n; ++j)
        {
            if(!vis[j] && MIN > dis[j])
            {
                MIN = dis[j];
                k = j;
            }
        }
        vis[k] = 1; //将节点k加入x
        //更新y区域 
        for(int j=1; j<=n; ++j)
        {
            if(!vis[j] && MIN+w[k][j] < dis[j])
            {
                dis[j] = MIN + w[k][j];
            }
        }       
    }
}
int main()
{
   //将数组全部初始化为最大值
    for(int i=0; i<MAXN; ++i)
        for(int j=0; j<MAXN; ++j)
            w[i][j] = INF;

    memset(vis, 0, sizeof(vis));
    memset(dis, 0, sizeof(dis));
    int v , e; // v 节点, e边 
    while(cin >> v >> e)
    {
       int j, k , len;
       //初始化图数组 
       for(int i=0; i<e; ++i)
       {
           cin >> j >> k >>len;
           w[j][k] = w[k][j] = len;
       }
        dijkstra(v); 
        for(int i=1; i<=v; ++i)
            cout << dis[i] << " ";
    }
    return 0;
}

全部评论

相关推荐

代码飞升:别用口语,后端就写后端,前端就写前端,最后别光后悔
点赞 评论 收藏
分享
二月份来北京实习,虽然提前做了攻略,但是是人生第一次经历租房,全程自己搞定,所以难免还是踩坑了😅奉劝大家,租房不要只看自己的房间如何,还要看别人的房门口环境如何因为我就是那个倒霉蛋,我旁边房间额门口堆了一大堆杂物,都是另一个房间的人放在外面的,而且他门口放了几十双鞋子,冬天还好,现在是夏天,可太味了,怎么有这么多鞋啊啊啊啊,请看图片O(≧口≦)O一开始这屋里是一个人住,后来变成两个人住(他说他妈妈来北京看病暂时住,ok能体谅的)但是大概一个多月以后他妈妈回家了,无缝衔接了一位女朋友接着住,而且他的女朋友巨能买东西,我真的不得不吐槽,🥲我不管别人怎么花钱的,但是你买东西你起不来,你能不能换个时间约送上门,总是在周内或者周末的某一天早上七点多,没到起来的时间,快递员框框敲门了!!!!而且经常点外卖但是我们楼下有门禁,外卖员按响铃他俩不去解锁,一直等一直等,等到我们其他人受不了去帮解锁,吵得要死,他们像聋了一样!!!服啦!!!我的房租一个月不到1600,但是是阳隔,很不隔音,隔壁的大哥有时候会半夜吃薯片或者嗑瓜子(凌晨两三点的时候)好几次我都从梦里被嗑出来了🥲还好还剩两个月就实习结束可以回家了,呜呜想家,想我自己的窝😭
码农索隆:这也是我不喜欢合租的原因
我的租房踩坑经历
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务