最短路径(迪杰斯特拉算法)

假定条件和上一篇相同。。。

其实算法思路和上一篇也相同,均为贪心算法。。。

/*
*  author: buer
*  github: buer0.github.com
*/

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 10

typedef struct Graph
{
    int table[MAXSIZE][MAXSIZE];
    int num;
}Graph;

void createTable(Graph *graph);
void printTable(Graph *graph);
void shortest(Graph *graph, int start, int end);

int main(int argc, char *argv[])
{
    Graph graph;

    createTable(&graph);

    printTable(&graph);

    shortest(&graph, 0,1);
    return 0;
}

void shortest(Graph *graph, int start, int end)
{
    int num = graph->num;
    int pre[num];
    int weight[num];
    int final[num];
    int i, j,min, k;

    for(i=0; i<num; i++)
    {
        pre[i] = 0;
        weight[i] =( graph->table)[start][i];
        final[i] = 0;
    }

    final[start] = 1;

    for(i=1; i<num; i++)
    {
        min = 65535;

        for(j=0;j<num; j++)
        {
            if((!final[j]) && weight[j] != 0 && weight[j] < min)
            {
                min = weight[j];
                k = j;
            }
        }

        final[k] = 1;

        if(k == end)
        {
            break;
        }

        for(j=0; j<num; j++)
        {
            if((!final[j]) && ((min+(graph->table)[k][j] )< weight[j]) )
            {
                weight[j] = min+(graph->table)[k][j];
                pre[j] = k;
            }
        }
    }

    for(i=0; i<num ; i++)
    {
        printf("%d ", weight[i]);
    }

}

void createTable(Graph *graph)
{
    int i, j, temp;
    printf("输入节点数:");
    scanf("%d", &(graph->num));

    for(i=0; i<graph->num; i++)
    {
        printf("第 %d 行:", i+1);
        for(j=0; j<graph->num; j++)
        {
            scanf("%d", &temp);
            if(temp == ‘ ‘)
            {
                j --;
            }else {
                (graph->table)[i][j] = temp;
            }
        }
        getchar();
    }
}

void printTable(Graph *graph)
{
    int i,j;
    printf("\n");
    for(i=0; i<graph->num; i++)
    {
        for(j=0; j<graph->num; j++)
        {
            printf("%d ", (graph->table)[i][j]);
        }
        printf("\n");
    }
 }
时间: 2024-12-24 03:29:31

最短路径(迪杰斯特拉算法)的相关文章

数据结构图之三(最短路径--迪杰斯特拉算法——转载自i=i++

数据结构图之三(最短路径--迪杰斯特拉算法) [1]最短路径 最短路径?别乱想哈,其实就是字面意思,一个带边值的图中从某一个顶点到另外一个顶点的最短路径. 官方定义:对于内网图而言,最短路径是指两顶点之间经过的边上权值之和最小的路径. 并且我们称路径上的第一个顶点为源点,最后一个顶点为终点. 由于非内网图没有边上的权值,所谓的最短路径其实是指两顶点之间经过的边数最少的路径. 别废话了!整点实际的哈,你能很快计算出下图中由源点V0到终点V8的最短路径吗? [2]迪杰斯特拉算法 迪杰斯特拉算法是按路

最短路径---迪杰斯特拉算法[图中一个顶点到其他顶点的最短距离]

转自大神:https://www.cnblogs.com/skywang12345/p/3711512.html 是真的牛逼 看大神的吧 舒服点  我注释了点最后代码的部分 迪杰斯特拉算法介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算). 此外,引进两个集合S和U.S的作用

[从今天开始修炼数据结构]图的最短路径 —— 迪杰斯特拉算法和弗洛伊德算法的详解与Java实现

在网图和非网图中,最短路径的含义不同.非网图中边上没有权值,所谓的最短路径,其实就是两顶点之间经过的边数最少的路径:而对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,我们称路径上第一个顶点是源点,最后一个顶点是终点. 我们讲解两种求最短路径的算法.第一种,从某个源点到其余各顶点的最短路径问题. 1,迪杰斯特拉(Dijkstra)算法 迪杰斯特拉算法是一个按路径长度递增的次序产生最短路径的算法,每次找到一个距离V0最短的点,不断将这个点的邻接点加入判断,更新新加入的点到V0的距

最短路径 - 迪杰斯特拉算法

和 普利姆算法 思想有点像 还是搞不懂到底p数组到底有什么用 #include<cstdio> #include<cstring> #include<cstdlib> #define MAXVEX 9 #define INFINITY 655 typedef struct { char vexs[MAXVEX]; int matirx[MAXVEX][MAXVEX]; int numVextexes,numEdges; }MGraph; void ShortestPat

最短路径算法——迪杰斯特拉算法(Dijkstra)

图结构中应用的最多的就是最短路径的查找了,关于最短路径查找的算法主要有两种:迪杰斯特拉算法(Dijkstra)和Floyd算法. 其中迪杰斯特拉算法(Dijkstra)实现如下: 原理就是不断寻找当前的最优解: void main() { int V[Max][Max]={0,8,32,Infinity,Infinity, 12,0,16,15,Infinity, Infinity,29,0,Infinity,13, Infinity,21,Infinity,0,7, Infinity,Infi

数据结构之单源最短路径(迪杰斯特拉算法)-(九)

最开始接触最短路径是在数据结构中图的那个章节中.运用到实际中就是我在大三参加的一次美赛中,解决中国的水资源问题.所谓单源最短路径,就是一个起点到图中其他节点的最短路径,这是一个贪心算法. 迪杰斯特拉算法原理(百科): 按路径长度递增次序产生算法: 把顶点集合V分成两组: (1)S:已求出的顶点的集合(初始时只含有源点V0) (2)V-S=T:尚未确定的顶点集合 将T中顶点按递增的次序加入到S中,保证: (1)从源点V0到S中其他各顶点的长度都不大于从V0到T中任何顶点的最短路径长度 (2)每个顶

图(最短路径算法————迪杰斯特拉算法和弗洛伊德算法).RP

文转:http://blog.csdn.net/zxq2574043697/article/details/9451887 一: 最短路径算法 1. 迪杰斯特拉算法 2. 弗洛伊德算法 二: 1. 迪杰斯特拉算法 求从源点到其余各点的最短路径 依最短路径的长度递增的次序求得各条路径 路径长度最短的最短路径的特点: 在这条路径上,必定只含一条弧,并且这条弧的权值最小. 下一条路径长度次短的最短路径的特点: 它只可能有两种情况:或是直接从源点到该点(只含一条弧):或者是从源点经过顶点v1,再到达该顶

算法-迪杰斯特拉算法(dijkstra)-最短路径

迪杰斯特拉算法(dijkstra)-最短路径 简介: 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 算法思想: 设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中

最短路径之迪杰斯特拉算法(Dijkstra)

1.迪杰斯特拉(dijkstra)算法简介 Dijkstra算法是由E.W.Dijkstra于1959年提出,又叫迪杰斯特拉算法,它应用了贪心算法模式, 是目前公认的最好的求解最短路径的方法.算法解决的是有向图中单个源点到其他顶点的最短 路径问题,其主要特点是每次迭代时选择的下一个顶点是标记点之外距离源点最近的顶点.但 由于dijkstra算法主要计算从源点到其他所有点的最短路径,所以算法的效率较低. 2.dijkstra算法基本过程 假设路网中每一个节点都有标号 是从出发点s到点t的最短路径长

数据结构之最短路径(1) [迪杰斯特拉算法]

迪杰斯特拉算法介绍: 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想: 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算). 此外,引进两个集合S和U.S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离). 初始时,S中只有起点s:U中是除s之外的顶点,并且