首页 > 编程语言 >求最短路径迪杰斯特拉算法

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

时间:2023-12-02 21:12:09浏览次数:29  
标签:dist weight vernum int 迪杰 adjvex 算法 斯特拉 printf

代码运行截图:

完整代码:

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

#define MaxSize 20
#define MAX 999

typedef struct ArcNode{        //边表 
    int adjvex;                //边表中是顶点号!! 
    struct ArcNode *next;
    int weight;
}ArcNode;

typedef struct VNode{        //主表 
    int num;                //主表中是顶点值!! 
    struct ArcNode *first; 
}VNode,AdjList[MaxSize];

typedef struct{                    
    AdjList Ver;
    int vernum,edgenum;
}Graph;

void CreateGraph(Graph &G)
{
    int i,j,x;
    G.edgenum=0;
    G.vernum=0;
    
    printf("顶点个数:");
    scanf("%d",&G.vernum);
    
    printf("输入顶点表:\n");
    for(i=0;i<G.vernum;i++)
        scanf("%d",&G.Ver[i].num);
    
    printf("输入边表:\n");
    for(i=0;i<G.vernum;i++)
    {
        printf("与%d相连的顶点下标:\n",G.Ver[i].num);
        G.Ver[i].first=(ArcNode*)malloc(sizeof(ArcNode));
        G.Ver[i].first->next=NULL;
        ArcNode *p=G.Ver[i].first;
        for(j=0;j<G.vernum;j++)
        {
            scanf("%d",&x);
            if(x!=-1)
            {
                ArcNode *node=(ArcNode*)malloc(sizeof(ArcNode));
                node->next=NULL;
                node->adjvex=x;
                p->next=node;
                p=node;
                printf("输入该边的权值:");
                scanf("%d",&node->weight);
                G.edgenum++;    
            }
            else
                break;
        }
    }
}

void displayGraph(Graph G)
{
    int i;
    ArcNode *p=NULL;
    printf("顶点表:");
    for(i=0;i<G.vernum;i++)
        printf("%d    ",G.Ver[i].num);
    printf("\n");
    printf("边表:\n");
    for(i=0;i<G.vernum;i++)
    {
        printf("%d    -->",G.Ver[i].num);
        p=G.Ver[i].first->next;
        while(p)
        {
            printf("--权重为%d-->%d",p->weight,p->adjvex);
            p=p->next;
        }
        printf("\n");
    }
}

void dijkstra(Graph G,int start)
{
    int dist[G.vernum];
    bool visited[G.vernum];
    int i,j;
    for(i=0;i<G.vernum;i++)
    {
        dist[i]=MAX;
        visited[i]=false;    
    }    
    
    dist[start]=0;            //起点到自身的路径长度 
    
    for (i = 0; i < G.vernum - 1; i++)
    {
        int min_dist = MAX;
        int min_index;

        // 选择距离起点最近的未访问节点
        for (j = 0; j < G.vernum; j++)
        {
            if (visited[j] == false && dist[j] <= min_dist)
            {
                min_dist = dist[j];
                min_index = j;
            }
        }

        visited[min_index] = true;

        // 更新与该节点相邻节点的最短路径
        ArcNode *p = G.Ver[min_index].first->next;
        while (p)
        {
            int adjvex = p->adjvex;
            int weight = p->weight;
            if (visited[adjvex] == false && dist[min_index] != MAX 
                        && dist[min_index] + weight < dist[adjvex])
            {
                dist[adjvex] = dist[min_index] + weight;
            }
            p = p->next;
        }
    }

    // 打印最短路径结果
    printf("节点\t最短路径\n");
    for (i = 0; i < G.vernum; i++)
    {
        printf("%d\t%d\n", G.Ver[i].num, dist[i]);
    }
}

int main()
{
    Graph G;
    CreateGraph(G);
    printf("\n");
    displayGraph(G);
    printf("\n");
    dijkstra(G,0); 
    return 0;
}

 

标签:dist,weight,vernum,int,迪杰,adjvex,算法,斯特拉,printf
From: https://www.cnblogs.com/simpleset/p/17872219.html

相关文章

  • 扩展欧几里得算法
    同余方程\(ax\equivb(\modm)\)二元一次方程\(ax+by=c\),其中\(a,b,c\)为已知的正整数这两者可以相互转化,显然对于这个二元一次方程,有:\(ax\modb=c\modb\),可以转化为\(ax\equivc(modb)\)裴蜀定理当我们考虑一个二元一次方程解的情况,我们发现:1.可能无解2.有解即有......
  • C# 面试常见递归算法
    前言今天我们主要总结一下C#面试中常见递归算法。C#递归算法计算阶乘的方法一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。1808年,基斯顿·卡曼引进这个表示法。原理:亦即n!=1×2×3×...×(n-1)×n。阶乘亦可以递归方式定......
  • 算法之快速排序1初始(java)
    一:概述快速排序、归并排序、堆排序等都是比冒泡排序更快的算法。其中快速排序是从冒泡排序演变而来。快速排序之所以比冒泡排序要快是因为它用了分治法。    二:具体说明同冒泡排序一样,快速排序也属于交换排序,通过元素之间的比较进行比较和交换位置来达到排序的目的。不同的是......
  • 【算法 Java】递归,阶乘的递归实现,斐波那契数列的递归实现
    递归定义:方法直接或间接地调用方法本身思路:将大问题转化为一个与原问题相似的规模更小的问题注意:递归死循环会导致栈内存溢出一些使用递归求解的问题阶乘Factorial.javaimportjava.util.Scanner;publicclassFactorial{publicstaticvoidmain(String[]args)......
  • 【教3妹学编程-算法题】统计子串中的唯一字符
    3妹:“太阳当空照,花儿对我笑,小鸟说早早早,你为什么背上炸药包”2哥 :3妹,什么事呀这么开发。3妹:2哥你看今天的天气多好啊,阳光明媚、万里无云、秋高气爽,适合秋游。2哥:是啊,立冬之后天气多以多云为主,好不容易艳阳高照。可是你不能秋游,赶紧收拾收拾上班去啦3妹:哼,好吧~2哥:给你出了一道题......
  • K最近邻算法
    汉堡店销售量预测某汉堡店每天都会做新鲜的汉堡,每天卖出的汉堡个数与天气等因素有关。请根据如下几个特征,用KNN算法预测当天售卖汉堡的个数。(1)天气指数1~5:1表示天气很差,5表示天气很好。(2)是否是周末:周末为1,否则为0。(3)是否有打折活动:1表示有打折,0表示没有打折。售出汉堡的历史数据表......
  • 二分图最大匹配模板(匈牙利算法)
    二分图最大匹配模板(匈牙利算法)P3386【模板】二分图最大匹配-洛谷|计算机科学教育新生态(luogu.com.cn)structaugment_path{ vector<vector<int>>g; vector<int>pa;//匹配 vector<int>pb; vector<int>vis;//访问 intn,m;//两个点集中的顶......
  • 高斯混合模型:GMM和期望最大化算法的理论和代码实现
    高斯混合模型(gmm)是将数据表示为高斯(正态)分布的混合的统计模型。这些模型可用于识别数据集中的组,并捕获数据分布的复杂、多模态结构。gmm可用于各种机器学习应用,包括聚类、密度估计和模式识别。在本文中,将首先探讨混合模型,重点是高斯混合模型及其基本原理。然后将研究如何使......
  • 51k+ Star!动画图解、一键运行的数据结构与算法教程!
    大家好,我是Java陈序员。我们都知道,《数据结构与算法》——是程序员的必修课。无论是使用什么编程语音,亦或者是前后端开发,都需要修好《数据结构与算法》这门课!在各个互联网大产的面试中,对数据结构和算法的考核乐此不疲。往往《数据结构与算法》学得好的,都能拿到高薪!但是《数......
  • 代码随想录算法训练营第三天 | 203.移除链表元素 707.设计链表 206.反转链表
    LeetCode 203.移除链表元素视频链接:LeetCode203思路:根据链表的性质,将目标值对应的节点保存在一个临时节点中,再重新设置cur下一个节点,再将临时节点进行删除classSolution{public:ListNode*removeElements(ListNode*head,intval){//删除头节点......