一、目的

解决单源最短路径问题,求解从起点到其余各点的最短距离。

二、思想

  1. 每次寻找距离起点最短距离且没有被访问的点
  2. 根据这个点更新起点到各点的最短距离
  3. 以上内容循环n次(n为结点数)

三、代码

#include <cstdio>
#include <algorithm>
using namespace std;
int maxdis=10000;
int main(){
    int n,e; scanf("%d %d",&n,&e);   //输入结点和边数
    int graphic[n][n];          //创建图
    fill(graphic[0],graphic[0]+n*n,maxdis);  //初始化图
    for (int i = 0; i < e; ++i) {
        int a,b,w; scanf("%d %d %d",&a,&b,&w);
        graphic[a][b]=w;
    }

    int dis[n];         //初始化距离数组
    for (int k = 0; k < n; ++k) {
        dis[k] = maxdis;
    }
    dis[0]=0;           //起点为0
    bool visited[n];    //初始化访问判别数组
    for (int j = 0; j < n; ++j) {
        visited[j]=false;
    }
    //遍历N次
    for (int k = 0; k < n; ++k) {
        //寻找距离起点距离最短,且没有被访问的点
        int min = maxdis;
        int val = -1;
        for (int i = 0; i < n; ++i) {
            if(dis[i]<min && visited[i]==false){
                min = i;
                val = dis[i];
            }
        }
        visited[min]=true;

        //更新距离
        for (int j = 0; j < n; ++j) {
            if(graphic[min][j]!=maxdis && graphic[min][j] + val < dis[j])
                dis[j] = graphic[min][j] + val;
        }
    }
    for (int l = 0; l < n; ++l) {
        printf("%d ",dis[l]);
    }
}

输入:
6 8
0 1 1
0 3 4
0 4 4
1 3 2
2 5 1
3 2 2
3 4 3
4 5 3

输出:0 1 5 3 4 6

四、其它

不能存在负权。


浮生若梦
1 声望0 粉丝

夫天地者万物之逆旅也,光阴者百代之过客也。


引用和评论

0 条评论