• 9-最短路径(dijkstra)


    参考博客:http://www.wutianqi.com/?p=1890

    #include <iostream>
    using namespace std;
    #define  max 1<<20  //无穷大
    int pre[100];    //p[i]存放路径中i前面一个点
    int dis[100];    //到远点的距离
    int c[100][100]; //每个点间的距离  

    int dijkstra(int n, int v){  //v是源点,n是点的个数
         bool s[100] = {0};   //表示是否在原点集合中

        for(int i = 1; i <= n; i++){ //初始化dis[],s[],pre[]
            dis[i] = c[i][v];
            s[i] = 0;
            if(dis[i] != max){
                pre[i] = v;
            }
            else
                pre[i] = 0;
        }
        dis[v] = 0;
        s[v] = 1;
        for(int i = 2; i <= n; i++){
            int temp = max, u = v;
            for(int j = 1; j <= n; j++){    //找到最小的直达源点的点
                if(!s[j] && temp > dis[j]){
                    temp = dis[j];
                    u = j;
                }
            }
    //        cout << "u: " << u << endl;
            s[u] = 1; //表示将找的的点放入源点集合
            for(int j = 1; j <= n; j++){          //更新u的临边到远点的距离
                if(!s[j] && c[j][u] < max){
    //                cout << "jJJ" << endl;
                    if(dis[j] > c[j][u] + dis[u]){
                        dis[j] = c[j][u] + dis[u];
                        pre[j] = u;
    //                    cout << "j:" << j << endl;
                    }
                }
            }
        }
        return 1;
    }

    int luxian(int v, int u){  //查找点源点v到u点的距离
        int p;
        int count = 0, a[100] = {u};
        p = pre[u];
        while(p != v){
            a[++count] = p;
            p = pre[p];
        }
        a[++count] = v;
        cout << "count" << count << endl;
        for(int i = count; i >= 0; i--)
            cout << a[i] << " -> ";
    }

    int main(){
        ios::sync_with_stdio(false);
        int n, line, a, b, len;
        cin >> n >> line;
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= n; j++)
                c[i][j] = max;
        cout << max;
        for(int i = 1; i <= line; i++){
            cin >> a >> b >> len;
            if(len < c[a][b]){
                c[a][b] = len;
                c[b][a] = len;
            }
        }
        for(int i = 1; i <= n; i++)
            dis[i] = max;
            
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= n; j++)
                cout << c[i][j] << "      ";
            cout << endl;
        }
            
        dijkstra(n, 1);
        luxian(1, n);
        cout << endl;
        cout << "1到n的最小距离: " << dis[n] << endl;
        return 0;
    }

  • 相关阅读:
    【DOM编程艺术】positionMessage函数和moveMessage函数
    Javascript中setTimeout和setInterval的区别和使用
    添加数据时候获取自增的ID
    字符串入门 大纲
    字符串入门练习题10 星球语言的翻译 题解
    字符串入门练习题9 聊天室 题解
    字符串入门练习题8 大小写转换密码锁 题解
    字符串入门练习题7 男孩或者女孩 题解
    字符串入门练习题6 字符串加密 题解
    字符串入门练习题5 有用的数学 题解
  • 原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/7327893.html
Copyright © 2020-2023  润新知