IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构实验7《基于Dijsktra算法的最短路径求解》 -> 正文阅读

[数据结构与算法]数据结构实验7《基于Dijsktra算法的最短路径求解》

(visual studio 2019可运行)
输入及输出要求见《数据结构C语言(第二版)》严蔚敏版
【本文仅用于啥都看不懂还想交作业选手】

加了一点输入异常的反馈

基于基于Dijsktra算法的最短路径求解 - 简书改动

(这是一个我终于明白并不需要一次性统一输出的故事)

#include<iostream>
using namespace std;
#define MAXSIZE 100
#define OK 1
typedef int Status;
//用两个数组分别存储顶点表和邻接矩阵
#define MaxInt 32767                        //表示极大值,即∞
#define MVNum 100                           //最大顶点数 
typedef char VerTexType;                //假设顶点的数据类型为字符型 
typedef int ArcType;                    //假设边的权值类型为整型 
typedef struct {
    VerTexType vexs[MVNum];                   //顶点表 
    ArcType arcs[MVNum][MVNum];               //邻接矩阵 
    int vexnum;//图的总点数
    int arcnum;//图的总边数                    
}AMGraph;
int LocateVex(AMGraph G, VerTexType u)
{//存在则返回u在顶点表中的下标;否则返回-1
    int i;
    for (i = 0; i < G.vexnum; ++i)
        if (u == G.vexs[i])
            return i;
    return -1;
}
VerTexType OrigialVex(AMGraph G, int u)
{//存在则返回u在顶点表中的下标;否则返回-1
    return G.vexs[u];
}
Status CreateUDN(AMGraph& G) {
    //采用邻接矩阵表示法,创建无向网G 
    cin >> G.vexnum;  //输入总顶点数
    cin >> G.arcnum;  //输入总边数 
    int i, j, k, w;
    VerTexType v1, v2;
    for (i = 0; i < G.vexnum; ++i)
        cin >> G.vexs[i];                           //依次输入点的信息 
    for (i = 0; i < G.vexnum; ++i)  //初始化邻接矩阵,边的权值均置为极大值
        for (j = 0; j < G.vexnum; ++j)
            G.arcs[i][j] = MaxInt;
    for (k = 0; k < G.arcnum; ++k) {                     //构造邻接矩阵 
        cin >> v1 >> v2 >> w;                                 //输入一条边依附的顶点及权值 
        i = LocateVex(G, v1);  j = LocateVex(G, v2);  //确定v1和v2在G中的位置
        G.arcs[i][j] = w; //边<v1, v2>的权值置为w 
        G.arcs[j][i] = G.arcs[i][j];              //置<v1, v2>的对称边<v2, v1>的权值为w 
    } 
    return OK;
}
Status CreateDN(AMGraph& G, int dian, int bian) {   //创建有向网G的邻接矩阵
    G.vexnum = dian;
    G.arcnum = bian;
    int i, j, k, w;
    VerTexType v1, v2;
    for (i = 0; i < G.vexnum; ++i)
        cin >> G.vexs[i];                           //依次输入点的信息 
    for (i = 0; i < G.vexnum; ++i)  //初始化邻接矩阵,边的权值均置为极大值
        for (j = 0; j < G.vexnum; ++j)
            G.arcs[i][j] = MaxInt;
    for (k = 0; k < G.arcnum; ++k) {                     //构造邻接矩阵 
        cin >> v1 >> v2 >> w;                                 //输入一条边依附的顶点及权值 
        i = LocateVex(G, v1);  j = LocateVex(G, v2);  //确定v1和v2在G中的位置
        G.arcs[i][j] = w; //边<v1, v2>的权值置为w  
    }
    return OK;
}
int D[MVNum], Path[MVNum],S[MVNum];

void ShortestPath_DIJ(AMGraph G, VerTexType V) {
    //用Dijkstra算法求有向网G的v0顶点到其余顶点的最短路径 
    int i, n, v, min, w;
    n = G.vexnum;                         //n为G中顶点的个数 
    int v0 = LocateVex(G, V);
    for (v = 0; v < n; ++v)
    {               //n个顶点依次初始化 
        S[v] = false;                   //S初始为空集 
        D[v] = G.arcs[v0][v];               //将v0到各个终点的最短路径长度初始化 
        if (D[v] < MaxInt)
            Path[v] = v0; //v0和v之间有弧,将v的前驱置为v0
        else
            Path[v] = -1;                //如果v0和v之间无弧,则将v的前驱置为-1 
    }
    S[v0] = true;                     //将v0加入S 
    D[v0] = 0;                            //源点到源点的距离为0 
    D[-1] = -1;              //出现异常顶点
    /*―开始主循环,每次求得v0到某个顶点v的最短路径,将v加到S集―*/
    for (i = 1; i < n; ++i){                   //对其余n?1个顶点,依次进行计算 
        min = MaxInt;
        for (w = 0; w < n; ++w)
            if (!S[w] && D[w] < min)
            {
                v = w; min = D[w];
            }           //选择一条当前的最短路径,终点为v 
        S[v] = true;                          //将v加入S 
        for (w = 0; w < n; ++w)   //更新从v0出发到集合V?S上所有顶点的最短路径长度 
            if (!S[w] && (D[v] + G.arcs[v][w] < D[w])) {
                D[w] = D[v] + G.arcs[v][w];     //更新D[w] 
                Path[w] = v;                     //更改w的前驱为v 
            }
    }
}
void find(AMGraph G, int v,char A)
{
    int n = G.vexnum;
    if (Path[v] == -1||v==-1)
        return;
    else
    {
        find(G, Path[v],A);
        cout << OrigialVex(G, Path[v]) << " ";
    }
}
int main()
{
    char A, B;
    int a, b;
    while (cin >> a >> b && a && b) {
        AMGraph G;
        CreateDN(G, a, b);
        cin >> A;
        ShortestPath_DIJ(G, A);
        cin >> B;
        int n = LocateVex(G, B);
        cout << D[n] << endl;
        find(G, n,A);
        if (D[n] == -1)//异常查找
            cout << "wrong point!" << endl;
        else
            cout << B << endl;
    }
    return 0;
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章           查看所有文章
加:2021-11-24 08:12:21  更:2021-11-24 08:14:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 15:34:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码