Dijkstra算法的实现

//dijkstra.cpp
//Dijkstra算法的实现
//读入“DijkstraTxt”中的部分网络数据“Test.txt”(弧段起点ID,弧段终点ID,弧段距离)
//用Dijkstra算法生成的最佳路径再写入“RouteTxt.txt”文件中

#include <iostream>
#include <fstream>
#include <iomanip>
#include <sstream>
using namespace std;
#define MAXIMUM 1000000000 //无穷大

typedef struct recordList
{
    int startPoint;   //起点
    int endPoint;     //终点
    float length;     //弧段长度
    recordList *next; //结构体指针
} record;             //定义Record结构体类型表示从文件中读取的数据记录

void main()
{
    //打开Test.txt并从中读取数据
    ifstream inPutFile("Test.txt", ios::in);
    //以创建方式打开文件RouteTxt.txt并写入数据
    ofstream outPutFile("RouteTxt.txt", ios::out);
    if (!inPutFile || !outPutFile) //文件打开异常处理
    {
        cout << "文件打开失败!" << endl;
        exit(1);
    }
    outPutFile << "\tDijkstra 算法实现结果数据\t" << endl;
    outPutFile << "起点\t终点\t距离\t\t路径" << endl;

    int numPoint;        //点数
    int numEdge;         //边数
    int maxPoint;        //最大点号
    record *head = NULL; //数据链表表头
    record *data = NULL; //读取的一行数据

    data = (record *)new record; //分配一行数据的内存空间
    //读取一行数据,包括起点、终点、弧段长度
    inPutFile >> data->startPoint >> data->endPoint >> data->length;
    head = data;                                      //数据链表表头指针
    numEdge = 1;                                      //初始边数为1
    maxPoint = max(data->startPoint, data->endPoint); //初始最大点号

    while (!inPutFile.eof()) //逐行读取文件中的数据到data中
    {
        data->next = (record *)new record; //动态分配内存空间
        data = data->next;                 //指向下一个结构体
        //读取一行数据,包括起点、终点、弧段长度,数据格式(弧段起点ID,弧段终点ID,弧段距离)
        inPutFile >> data->startPoint >> data->endPoint >> data->length;
        //若maxPiont小于起点或终点点号,更新maxPoint
        if (maxPoint < data->startPoint)
            maxPoint = data->startPoint;
        if (maxPoint < data->endPoint)
            maxPoint = data->endPoint;

        numEdge++; //边数增加1
    }
    inPutFile.close(); //关闭文件流
    data->next = NULL; //最后的指针赋值为空

    /// 以上代码实现从文件读入数据,以下实现算法计算并写入结果到文件
    int i, j, k;                           //变量
    float *path = new float[maxPoint + 1]; //路径距离数组
    int *route = new int[maxPoint + 1];    //路由表
    bool *flag = new bool[maxPoint + 1];   //最短路径求取成功标记
    for (i = 0; i <= maxPoint; i++)        //按点号从小到大遍历所有结点做源结点
    {
        for (j = 0; j <= maxPoint; j++) //初始化路由表和路径距离数组
        {
            path[j] = MAXIMUM; //路径距离数组初始化为无穷大
            route[j] = -1;     //-1表示不能到达或最短路径尚未找出
            flag[j] = false;
        }

        record *getData = head;    //获得链表数据头指针
        float minLength = MAXIMUM; //当前的最小距离
        int lastPoint = i;         //前一次找出的距离最短的路径的终点

        while (getData != NULL) //遍历链表,找出源结点出发的最短路径
        {
            if (getData->startPoint == i) //起点为i
            {
                path[getData->endPoint] = getData->length;      //获得源结点到目的结点的距离
                route[getData->endPoint] = getData->startPoint; //路由信息存储为目的结点的前一个结点
                if (minLength > getData->length)                //距离小于当前最小距离
                {
                    minLength = getData->length;   //获得当前最小距离
                    lastPoint = getData->endPoint; //获得当前最小距离的终点
                }
            }
            getData = getData->next; //指向下一个结构体
        }
        flag[lastPoint] = true; //标记起点到当前终点的最短路径已求出

        for (k = 0; k < maxPoint; k++) //按点号从小到大遍历所有结点做目的结点
        {
            getData = head;             //获得链表数据头指针
            float tempLength = MAXIMUM; //当前的最小距离
            int tempPoint = -1;         //前一次找出的距离最短的路径的终点

            while (getData != NULL) //遍历链表,更新路由信息和距离数组
            {
                if ((getData->startPoint == lastPoint) && (getData->endPoint != i) && !flag[getData->endPoint])
                {                                                                //起点为上一次最短路径的终点,终点与起点不同,最短路径未求出
                    if ((minLength + getData->length) < path[getData->endPoint]) //有更短的路径
                    {
                        path[getData->endPoint] = minLength + getData->length; //获得源结点到目的结点的距离
                        route[getData->endPoint] = getData->startPoint;

                        //路由信息存储为目的结点的前一个结点
                    }
                }
                getData = getData->next; //指向下一个结构体
            }

            for (j = 0; j < maxPoint; j++)
            { //遍历path数组,找出到最短路径尚未找出的终点的距离最小值
                if (!flag[j] && tempLength >= path[j] && j != i)
                {                         //最短路径尚未找出,且距离比当前最小距离更小,起点和终点不同
                    tempLength = path[j]; //更新最小距离值
                    tempPoint = j;        //更新当前最短路径的终点
                }
            }

            lastPoint = tempPoint;  //获得当前最小距离的终点
            minLength = tempLength; //获得当前最小距离
            flag[lastPoint] = true; //标记起点到当前终点的最短路径已求出
        }

        /// 下面先指定文件写入结果数据
        for (j = 0; j <= maxPoint; j++) //从每一个结点出发
        {
            if (path[j] == MAXIMUM) //路径不可达,或者终点和起点重叠
            {
                //向文件写入信息
                outPutFile << i << "\t" << j << "\t--\t\t--" << endl;
            }
            else
            {
                string strRoute;  //路径信息
                int r = route[j]; //第j个点为终点时其上一跳位置
                while (r != i)    //根据路由表反向查找路径信息
                {
                    stringstream ss;                       //使用字符串流将int转化为string型
                    ss << r;                               //字符串流写入
                    strRoute = "->" + ss.str() + strRoute; //构建路径信息字符串
                    r = route[r];                          //上一跳
                }
                //向文件写入数据 “起点 终点 距离 路径”
                outPutFile << i << "\t" << j << "\t" << path[j] << "\t\t" << i << strRoute << "->" <<  j << endl;
            }
        }
    }
    outPutFile.close(); //关闭文件流
    return;
}

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在现有省、市港口信息化系统进行有效整合基础上,借鉴新 一代的感知-传输-应用技术体系,实现对码头、船舶、货物、重 大危险源、危险货物装卸过程、航管航运等管理要素的全面感知、 有效传输和按需定制服务,为行政管理人员和相关单位及人员提 供高效的管理辅助,并为公众提供便捷、实时的水运信息服务。 建立信息整合、交换和共享机制,建立健全信息化管理支撑 体系,以及相关标准规范和安全保障体系;按照“绿色循环低碳” 交通的要求,搭建高效、弹性、高可扩展性的基于虚拟技术的信 息基础设施,支撑信息平台低成本运行,实现电子政务建设和服务模式的转变。 实现以感知港口、感知船舶、感知货物为手段,以港航智能 分析、科学决策、高效服务为目的和核心理念,构建“智慧港口”的发展体系。 结合“智慧港口”相关业务工作特点及信息化现状的实际情况,本项目具体建设目标为: 一张图(即GIS 地理信息服务平台) 在建设岸线、港口、港区、码头、泊位等港口主要基础资源图层上,建设GIS 地理信息服务平台,在此基础上依次接入和叠加规划建设、经营、安全、航管等相关业务应用专题数据,并叠 加动态数据,如 AIS/GPS/移动平台数据,逐步建成航运管理处 "一张图"。系统支持扩展框架,方便未来更多应用资源的逐步整合。 现场执法监管系统 基于港口(航管)执法基地建设规划,依托统一的执法区域 管理和数字化监控平台,通过加强对辖区内的监控,结合移动平 台,形成完整的多维路径和信息追踪,真正做到问题能发现、事态能控制、突发问题能解决。 运行监测和辅助决策系统 对区域港口与航运业务日常所需填报及监测的数据经过科 学归纳及分析,采用统一平台,消除重复的填报数据,进行企业 输入和自动录入,并进行系统智能判断,避免填入错误的数据, 输入的数据经过智能组合,自动生成各业务部门所需的数据报 表,包括字段、格式,都可以根据需要进行定制,同时满足扩展 性需要,当有新的业务监测数据表需要产生时,系统将分析新的 需求,将所需字段融合进入日常监测和决策辅助平台的统一平台,并生成新的所需业务数据监测及决策表。 综合指挥调度系统 建设以港航应急指挥心为枢纽,以各级管理部门和经营港 口企业为节点,快速调度、信息共享的通信网络,满足应急处置所需要的信息采集、指挥调度和过程监控等通信保障任务。 设计思路 根据项目的建设目标和“智慧港口”信息化平台的总体框架、 设计思路、建设内容及保障措施,围绕业务协同、信息共享,充 分考虑各航运(港政)管理处内部管理的需求,平台采用“全面 整合、重点补充、突出共享、逐步完善”策略,加强重点区域或 运输通道交通基础设施、运载装备、运行环境的监测监控,完善 运行协调、应急处置通信手段,促进跨区域、跨部门信息共享和业务协同。 以“统筹协调、综合监管”为目标,以提供综合、动态、实 时、准确、实用的安全畅通和应急数据共享为核心,围绕“保畅通、抓安全、促应急"等实际需求来建设智慧港口信息化平台。 系统充分整合和利用航运管理处现有相关信息资源,以地理 信息技术、网络视频技术、互联网技术、移动通信技术、云计算 技术为支撑,结合航运管理处专网与行业数据交换平台,构建航 运管理处与各部门之间智慧、畅通、安全、高效、绿色低碳的智 慧港口信息化平台。 系统充分考虑航运管理处安全法规及安全职责今后的变化 与发展趋势,应用目前主流的、成熟的应用技术,内联外引,优势互补,使系统建设具备良好的开放性、扩展性、可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值