zoukankan      html  css  js  c++  java
  • Dijkstra求图的最短路径

    #include<stdio.h>
    #include<iostream>
    #include<stdlib.h>
    #define maxdist 9999//距离无穷远
    #define MAX 100//图中结点数目最大值
    using namespace std;
    struct a{
        int v,n;//v是结点个数,n是边的个数
        int adj[MAX][MAX];//邻接矩阵     
    }Graph;
    int sure[MAX];
    int dist[MAX];
    int aim;
    
    void dijkstra(int v0){//v0是结点编号,某人编号是从1开始的,所以我之后的矩阵要去掉0 
        //v是结点个数(1~n) n是边的个数 adj是邻接矩阵
        dist[v0]=0;
        sure[v0]=1; //标记当前结点已经确定了最短路径
        for(int i=1;i<=Graph.v;i++){//初始化dist 
            if(i!=v0){
                dist[i]=Graph.adj[v0][i];
            }
        }
        for(int j=2;j<=Graph.v;j++){
            //找dist里面最小的  进行更新
            int min=maxdist;
            int subscript;
            for(int i=1;i<=Graph.v;i++){//从未确定的结点中找最小的 
                if(sure[i]==0&&dist[i]<min){
                    min=dist[i];
                    subscript=i;
                }
            } 
            //结点subcript已经确定   
            sure[subscript]=1;
            //用新标记的结点来更新  dist中未确定的结点
            for(int i=1;i<=Graph.v;i++){
                if(sure[i]==0&&Graph.adj[subscript][i]+min<dist[i]){//当前结点不确定  且距离可以缩小 
                    dist[i]=Graph.adj[subscript][i]+min;
                }
            } 
        }
        
    }
    int main(){//矩阵和数组都是从1开始 
    
        //memset(sure,0,sizeof(int));
        cin>>Graph.v>>Graph.n;
        //接收每一条边,然后赋值邻接矩阵 
        for(int i=1;i<=Graph.v;i++){
            for(int j=1;j<=Graph.v;j++){
                Graph.adj[i][j]=maxdist;
            }
        }
        for(int i=0;i<Graph.n;i++){
            int x,y;
            cin>>x>>y;
            cin>>Graph.adj[x][y];
            Graph.adj[y][x]=Graph.adj[x][y];    
        } 
        //邻接矩阵赋值完毕  接收起始结点aim 
        //for(int i=1;i<=Graph.v;i++){
    //        for(int j=1;j<=Graph.v;j++){
    //            if(j==1) cout<<Graph.adj[i][j];
    //            else cout<<" "<<Graph.adj[i][j];
    //        }
    //        cout<<endl;
    //    }
        cin>>aim;
        dijkstra(aim);
        for(int i=1;i<=Graph.v;i++){
            cout<<i<<": "<<dist[i]<<endl;
        }
    } 

    dist[i] 保存目标起点v0到结点i的路径长短,将不断更新。

    sure[i] =1表示此时dist[i]的值是 v0到结点i的最短路径长度

  • 相关阅读:
    C/C++预定义编译宏
    vi/vim教程
    Shell参数展开
    GNU构建系统和Autotool
    Makefile强制目标(没有命令或依赖的规则)
    C程序的存储空间布局(内存结构)
    linux deamon
    JavaScript高级程序设计——闭包
    PureMVC(JS版)源码解析(三):Observer类
    PureMVC(JS版)源码解析(二):Notification类
  • 原文地址:https://www.cnblogs.com/Elaine-DWL/p/6575994.html
Copyright © 2011-2022 走看看