dijkstra最短路径及其输出

高中同学让我求8个菜市场和35个销售点(他们之间还会有15个路口)之间35*8=280个组合分别的最短路径及其输出。

最短路水题,嘿嘿。能用自己学到的知识帮助别人解决问题真是极好的享受。

具体注释可以见代码,写的蛮清楚的。

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3 //INF代表无穷大
const int MAX_N=100;
int map[MAX_N][MAX_N],vis[MAX_N];
int dis[MAX_N];//dis代表到每个点的最短距离
int pre[MAX_N];//记录前驱
int ans[MAX_N];//输出路径的数组
void dijkstr(int x,int m){//x代表开始点,m代表顶点个数
    for(int i=1;i<=m;i++){
        dis[i]=map[x][i];
        vis[i]=0;
        if(map[x][i]!=INF)
        pre[i]=x;
        else
        pre[i]=-1;
    }
    int p;
    vis[x]=1;
    for(int i=1;i<=m;i++){
           int min=INF;
           for(int j=1;j<=m;j++){
               if(!vis[j]&&dis[j]<min){
                   min=dis[j];
                   p=j;
               }
           }
           vis[p]=1;
        for(int j=1;j<=m;j++){
            if(!vis[j]&&dis[p]+map[p][j]<dis[j])
            {
               dis[j]=dis[p]+map[p][j];
               pre[j]=p;
            }

        }
    }
}

int main(){
    int m,n,a,b,c;
    //输入文件中数字含义:1-8为基地,9-43为销售点,44-58是路口,格式为 点 点 距离 

    freopen("in.txt","r",stdin);//从文件中读出数据
    freopen("out.txt","w",stdout);//输出结果至文件
    void dijkstr(int x,int n);
     //  cout<<"请输入点的个数和边的条数"<<endl;
       cin>>m>>n;
        memset(vis,0,sizeof(vis));//m个点,n条边
        for(int i=1;i<=m;i++)
        for(int j=1;j<=m;j++){
             map[i][j]=INF;
        }
    //    cout<<"请依次按照起点,终点,距离的顺序输入边"<<endl;
        for(int j=1;j<=n;j++){
            cin>>a>>b>>c;
            map[a][b]=map[b][a]=c;
        }

       for(int i=1;i<=8;i++)
      {
        dijkstr(i,m);
        for(int j=9;j<=43;j++){
            int k=j;
            cout<<"从基地"<<i<<"到销售点"<<(j-8)<<"的最短距离是:"<<dis[k]<<endl;
        int p,len=1;
        p=k;
        while(p>=1)
        {
           ans[len++]=p;
           p=pre[p];
        }
       int first=0;
       cout<<"下面是具体路径: "<<endl;
       for(int r=len-1;r>=1;r--)
       {
            if(first++)
            cout<<"->";
            if(ans[r]>=1&&ans[r]<=8)
            cout<<"基地"<<ans[r];
            else if(ans[r]>=9&&ans[r]<=43)
            cout<<"销售点"<<ans[r]-8;
            else
            cout<<"路口"<<ans[r]-43;
          }
       cout<<endl;
       cout<<endl;
     }
    }

    return 0;
}

out文件中的结果预览:

详细数据和源代码提供下载: http://files.cnblogs.com/files/Tach-ac/%E6%9C%80%E7%9F%AD%E8%B7%AF.rar

时间: 2024-08-10 17:17:11

dijkstra最短路径及其输出的相关文章

Dijkstra最短路径算法[贪心]

Dijkstra算法的标记和结构与prim算法的用法十分相似.它们两者都会从余下顶点的优先队列中选择下一个顶点来构造一颗扩展树.但千万不要把它们混淆了.它们解决的是不同的问题,因此,所操作的优先级也是以不同的方式计算的:Dijkstra算法比较路径的长度,因此必须把边的权重相加,而prim算法则直接比较给定的权重. 源最短路径问题给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数.另外,还给定 V 中的一个顶点,称为源.现在我们要计算从源到所有其他各顶点的最短路径长度.这里的长度

hdu1548 A strange lift(bfs 或Dijkstra最短路径)

1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #define M 205 6 #define INF 0x3f3f3f3f 7 using namespace std; 8 9 int map[M][M]; 10 int d[M], vis[M]; 11 int n; 12 int b, e; 13 14 void Dijkstra(){

Dijkstra最短路径算法

求下图中的1号顶点到2.3.4.5.6号顶点的最短路径. 与Floyd-Warshall算法一样这里仍然使用二维数组e来存储顶点之间边的关系,初始值如下. 我们还需要用一个一维数组dis来存储1号顶点到其余各个顶点的初始路程,如下. 我们将此时dis数组中的值称为最短路的“估计值”. 既然是求1号顶点到其余各个顶点的最短路程,那就先找一个离1号顶点最近的顶点.通过数组dis可知当前离1号顶点最近是2号顶点.当选择了2号顶点后,dis[2]的值就已经从“估计值”变为了“确定值”,即1号顶点到2号顶

Dijkstra 最短路径算法详解 无向图

对于最短路径问题,这里介绍一种O(N^2)的求解方法. 对于求最短路径的问题一般都会给出一幅图,或者边与边的关系.如上图. 假设我们起点是A,我们要求到F的最短距离,我们会怎么做? 首先,因为A是起点,所以我们把对于每个点都有个参数,相对于A的距离,默认除了A到A为0,其他都是无穷大. 从起点A开始,我们更新与A相连通的点到A的距离,并把A点标记.如图: 我们遍历一次所有点与A的距离,找到最小的,这里是点B. 以它为起点,把它周围未被标记的点拿来做比较,显然,像F这种没有与A练过的点,当前距离就

17.boost dijkstra最短路径算法

到某个点的最短距离                到终点的最短路径 完整代码 1 #include <iostream> 2 #include <string> 3 #include <utility> 4 #include <vector> 5 #include <deque> 6 #include <boost/graph/adjacency_list.hpp> 7 //A*寻路算法 8 #include <boost\gr

基础算法之Dijkstra最短路径

核心思想:以起始原点为中心,想外层扩展,知道扩展到重点为止. 设到A点的最短路径上,A点前驱节点为B,则该路径包含到达节点B的最短路径. S集合代表已经探索过的节点,U集合表示未探索过的节点. 时间复杂度为O(n^2) 具体过程见下图和表 C++代码如下: 1 #include<stdio.h> 2 #define MAXDIS 4294967295 3 using namespace std; 4 5 class MatrixGraphic{ 6 public: 7 MatrxiGraphi

【算法日记】Dijkstra最短路径算法

上一篇再说广度优先搜索的适合提到了图. 狄克斯拉特算法是在图的基础上增加了 加权图的概念.就是节点和节点之间是有不同距离的 1.算法实例 用Dijkstra算法找出以A为起点的单源最短路径步骤如下 算法实现 # Dijkstra算法--通过边实现松弛 # 指定一个点到其他各顶点的路径--单源最短路径 # 初始化图参数 G = {1:{1:0, 2:1, 3:12}, 2:{2:0, 3:9, 4:3}, 3:{3:0, 5:5}, 4:{3:4, 4:0, 5:13, 6:15}, 5:{5:0

Dijkstra 最短路径算法 秒懂详解

想必大家一定会Floyd了吧,Floyd只要暴力的三个for就可以出来,代码好背,也好理解,但缺点就是时间复杂度高是O(n³). 于是今天就给大家带来一种时间复杂度是O(n²),的算法:Dijkstra(迪杰斯特拉). 这个算法所求的是单源最短路,好比说你写好了Dijkstra的函数,那么只要输入点a的编号,就可算出图上每个点到这个点的距离. 我先上一组数据(这是无向图): 5 6 1 2 5 1 3 8 2 3 1 2 4 3 4 5 7 2 5 2 图大概是这个样子: 我们以1为源点,来求所

如何记录Dijkstra最短路径的过程

    Dijkstra算法     假设找出v0到其他顶点的最短路径     s[N]初始化为0,如果找到v0到vn的最短路径则把s[n]置一     dist[N]初始化为v0到其他顶点的直接路径,两个没相连的顶点用MAX值代入     1.从所有未找到最短路径的顶点中找出dist最小的数值的下标u,所以s[u]置位.     2.用v0到vu的长度加上vu到其他顶点的长度,如果发现比dist中的小,则更新dist中的数值,但注意此时无需把s[]置位,因为此时得到的并不一定是最短路径.然后跳