带权单源最短路发[稠密图](Dijkstra)

对于稠密图,采用邻接矩阵较为合适

所以我们先构建一个邻接矩阵

typedef int Vertex;
typedef int WeightType;

//图
typedef struct MyGraph
{
    int v, e;
    WeightType G[MaxVertexNum][MaxVertexNum];
}MyGraph;

//顶点信息, 可以不定义
typedef struct NodeType
{
    Vertex id;
//    Data data;            当节点有需要添加的信息时使用 

}NodeType;

接下来我们使用Dijkstrs算法

void Dijkstra(int dist[], Vertex path[], MyGraph& g, Vertex id)
{
        //是否被收入的集合
    int collection[g.v];
    memset(collection, 0, sizeof(collection));
    dist[id] = 0;
    int mmin = INF;
    while(1)
    {
        int v = -1;
        mmin = INF;
        //稠密图用循环选出还没加入的节点的暂时的最短路的最小值
        for(int i = 0; i < g.v; i++)
            if(mmin > dist[i] && collection[i] != 0)
            {
                mmin = dist[i];
                v = i;
            }
        //如果都加入了, 那么退出
        if(v == -1)
            break;
        //将选出的节点收入
        collection[v] = 1;
        //修改因为收入节点而受影响的节点的最短路
        for(int j = 0; j < g.v; j++)
        {
            //如果使得原来的节点变得更短, 则更新最短距离并且更新最短路
            //这里collection[j]要没有被收入才计算,
            //因为如果j被收入,那么dist[v]应当更小,那么v应当在j之前被收入, 相互矛盾
            if(collection[j] == 0 && dist[j] > dist[v] + g.G[v][j])
            {
                dist[j] = dist[v] + g.G[v][j];
                path[j] = v;
            }
        }

    }
} 

新手,欢迎大家找错误,提建议

原文地址:https://www.cnblogs.com/yangzixiong/p/10739212.html

时间: 2024-11-03 23:50:51

带权单源最短路发[稠密图](Dijkstra)的相关文章

带权单源最短路[稀疏图](Dijkstra)

因为是稀疏图,所以应当选择邻接表来存储 构造一个邻接表 这只是我的构造方法,有很多种更好的构造方法,大家可以自己去构造 typedef int vertex; typedef int WeightType; //邻接表中单链表的节点 typedef struct ArcNode { int to; WeightType weight; struct ArcNode *next; }ArcNode; //顶点, 存放顶点信息和一个指向第一个与该顶点相连的节点 typedef struct Node

HDU 2544 最短路 (单源对短路,spfa,Dijkstra,Bellman-Ford)

题意:中文题目 思路:spfa+SLF优化.关于SPFA的详情请戳我 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N=105, INF=0x7f7f7f7f; 4 int n, m; 5 bool vis[N]; //标记是否在队列中 6 int dest[N]; //路径长度 7 int mapp[N][N]; 8 9 10 11 int spfa(int s, int e) //求最短路径 12 { 13 me

【算法系列学习】Dijkstra单源最短路 [kuangbin带你飞]专题四 最短路练习 A - Til the Cows Come Home

https://vjudge.net/contest/66569#problem/A http://blog.csdn.net/wangjian8006/article/details/7871889 邻接矩阵实现的单源最短路 1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<cstring> 5 #include<algorithm> 6 #include

模板C++ 03图论算法 1最短路之单源最短路(SPFA)

3.1最短路之单源最短路(SPFA) 松弛:常听人说松弛,一直不懂,后来明白其实就是更新某点到源点最短距离. 邻接表:表示与一个点联通的所有路. 如果从一个点沿着某条路径出发,又回到了自己,而且所经过的边上的权和小于0, 就说这条路是一个负权回路. 回归正题,SPFA是bellman-ford的一种改进算法,由1994年西安交通大学段凡丁提出.它无法处理带有负环的图,判断方法:如果某个点进入队列的次数超过N次则存在负环. SPFA的两种写法,bfs和dfs,bfs判别负环不稳定,相当于限深度搜索

POJ2253&amp;ZOJ1942--Frogger【SPFA】单源最短路变形

链接:http://poj.org/problem?id=2253 题意:一个青蛙在一块石头上,看到了另一个青蛙在另一块石头上,它想跳过去找它,如果距离太远它就需要借助别的石头当跳板,两块石头之间的青蛙距离被定义成两块石头之间所有路径中最大跳跃距离的最小值,求两个青蛙之间的青蛙距离. poj2263和它类似,链接:http://poj.org/problem?id=2263 解题报告:Here 这是最短路的变形,每两点之间都有路可以跳,更新最短路的值,权值记录成目前到这一点的最小青蛙距离就行了

Dijkstra算法 --- 单源最短路

Dijkstra算法适用于边权值为正的情况,可用于计算正权图上的单元最短路. 其伪代码如下: 设d[v0] = 0, 其他d[i] = INF 循环n次{ 在所有未标号的结点中,选取d值最小的结点x 给结点x加上永久标号 对于从x出发的所有边,执行松弛操作. } //松弛操作的伪代码如下: RELAX(u,v,w) if(u.d + w(u,v) < v.d){ v.d = w.d + w(u,v); pre[v] = u; } Dijkstra算法代码: /* Dijkstra 单源最短路算法

UVA 658 It&#39;s not a Bug, it&#39;s a Feature! (单源最短路,dijkstra+优先队列,变形,经典)

题意:有n个bug,有m个补丁,每个补丁有一定的要求(比如某个bug必须存在,某个必须不存在,某些无所谓等等),打完出来后bug还可能变多了呢.但是打补丁是需要时间的,每个补丁耗时不同,那么问题来了:要打多久才能无bug?(同1补丁可重复打) 分析: n<=20,那么用位来表示bug的话有220=100万多一点.不用建图了,图实在太大了,用位图又不好玩.那么直接用隐式图搜索(在任意点,只要满足转移条件,任何状态都能转). 但是有没有可能每个状态都要搜1次啊?那可能是100万*100万啊,这样出题

单源最短路_SPFA_C++

当我们需要求一个点到其它所有点的最短路时,我们可以采用SPFA算法 代码特别好写,而且可以有环,但是不能有负权环,时间复杂度是O(α(n)n),n为边数,α(n)为n的反阿克曼函数,一般小于等于4 模板:http://www.cnblogs.com/hadilo/p/5934679.html 我感觉自己讲的不会很好,丢一个链接算了 算法详解:http://www.360doc.com/content/13/1208/22/14357424_335569176.shtml 伪代码是自己写的: 可以

单源最短路 判负环

Wormholes http://poj.org/problem?id=3259 spfa 2e 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<queue> 5 #define mt(a,b) memset(a,b,sizeof(a)) 6 using namespace std; 7 const int inf=0x3f3f3f3f; 8 const int