算法设计与分析——使用dijkstra算法计算最短路径并且给出路径上的节点序列

算法课的一道作业题:

给定一个有向图,求v1到其他各节点的最短路径长度,以及最短路径。

要求:对dijkstra算法进行补充,使新算法在找出这些最短路径长度的同时,也能求出路径上的节点序列。

输入:一个有向带权图

算法设计与分析——使用dijkstra算法计算最短路径并且给出路径上的节点序列_第1张图片

输出的基本形式如下:

算法设计与分析——使用dijkstra算法计算最短路径并且给出路径上的节点序列_第2张图片

基本思路:

使用dijkstra计算v1节点到其他所有节点的路径长度:
二维数组cost[][]:存放有向带权图的初试状态;
一维数组s[]:bool类型,标记节点是否被选取;
一维数组dist[]:存放此轮迭代的最短路径,最后一轮迭代后,即为最终结果。
dist[i]=min{dist[i],dist[j]+cost[j][i]}

对于路径到的节点序列,新建一个path[]数组,每次更新路径长度时,更新path数组。
新的path[i]=path[j]+”vi”

//第一遍看代码的时候 可以忽略所有带有path的行,只看路径长度算法
//第二遍再看带有path的行,得到路径上的节点序列

#include 
#include 
#include 
#include 
#include 

using namespace std;

void shortest_path(int n,int cost[101][101]){
    bool s[101];    //判断该节点是否已经被加入
    int dist[101];    //存结果的数组
    string path[101];   //存路径的数组,没更新一次dist,路径也更新一次
    string init_path="v1";
    //初始化
    dist[1]=0;
    s[1]=true;

    for(int i=2;i<=n;i++){
        s[i]=false;
        dist[i]=-1;
    }

    //只加入了第一个节点的dist数组
    for(int i=2;i<=n;i++){
        dist[i]=cost[1][i];
        path[i]=init_path+"v"+to_string(i);//初始化 每个节点的路径就是v1到这个节点vi
    }
    //cout<
    //cout<
    //上述步骤已经完成了只有第一个节点的初始化
    //下一步:从dist中 找到一个距离最短的边,并把顶点加入s数组

    for(int i=2;i<=n;i++){ //剩下的N-1轮迭代
        int ii = 0; //记录该轮被加入的节点
        for(int j=2;j<=n;j++){//从第二个节点 到最后一个节点
            int min=1000;
            if(s[i]==false && dist[i]>0 && dist[i]true;

        for(int i=2;i<=n;i++){
            if(cost[ii][i]!=-1 && s[i]==false){//如果新加入的节点ii到i节点有路径 而且i不在已选取的节点中
                if(dist[i]!=-1){ //v1到i节点有路径
                    if(dist[i]>dist[ii]+cost[ii][i]){//而且 经过ii节点的路径更短
                        dist[i]=dist[ii]+cost[ii][i]; //更新dist
                        path[i]=path[ii]+"v"+to_string(i);
                    }
                }
                else{//v1到i没有路径
                    dist[i]=dist[ii]+cost[ii][i];
                    path[i]=path[ii]+"v"+to_string(i);
                }
        }
    }
}
  //cout<
    cout<<"start"<<"   "<<"end"<<"   "<<"length"<<"   "<<"nodes list"<for(int i =2;i<=n;i++){
        if(dist[i]<100){//决定输出的空格数 控制格式
        cout<<"v1      "<<"v"<"    "<"       "<else{
        cout<<"v1      "<<"v"<"    "<"      "<int main(){
    // insert code here...
    int n;  //节点个数
    int m;  //边的个数
    int a,b,c;
    int cost[101][101];   //保存各节点间的代价

    while(scanf("%d%d",&n,&m)!=0){
        //cost数组的初始化
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                cost[i][j]=-1;
            }
        }
        for(int i = 0;iscanf("%d%d%d",&a,&b,&c);
            cost[a][b]=c;
        }
        //cout<<"第一次初始化";
        shortest_path(n,cost);
    }

}

运行结果:

算法设计与分析——使用dijkstra算法计算最短路径并且给出路径上的节点序列_第3张图片

不得不说,一个代码功力不怎么样的小白,在没有任何参考资料的情况下,独立完成了代码,内心真的是十分冲动,恨不得仰天大笑“哈哈哈哈”。奈何天色太晚,如此夜黑风高,大好夜晚,我。。还是整理下一道代码题吧。。。。!!!!

你可能感兴趣的:(计算机算法设计与分析)