zoukankan      html  css  js  c++  java
  • 第十届蓝桥杯大赛软件类省赛研究生组 试题D:最短路

    第十届蓝桥杯大赛软件类省赛研究生组 试题D:最短路

    试题描述

    如下图所示,G是一个无向图,其中蓝色边的长度是1、橘色边的长度是2、绿色边的长度是3。
    

    此题不能直接上Dijkstra或者其他的最短路径算法。作为考试,要从图入手,很容易可以看出最短路径为6(A->B->J->S 或者其他路径)

    如果碰到很难看出的图,要用最短路径算法。

    Dijkstra通用C/C++模版

    #include <bits/stdc++.h>
    using namespace std;
    
    const int max_num = 100;
    const int max_int = 9999;
    
    void Dijkstra(int n, int v, int *dist, int *prev, int c[max_num][max_num]){
        bool s[max_num]; // 判断是否加入s集合
        for(int i = 1;i <= n;i++){
            s[i] = false;
            dist[i] = c[v][i];
            if(dist[i] == max_int)
                prev[i] = 0;
            else
                prev[i] = v;
        }
        dist[v] = 0;
        s[v] = true;
    
        for(int i = 2;i <= n ;i++){
            int min_value = max_int;
            int u = v;
            for(int j = 1;j <= n;j++){
                if(!s[j] && dist[j] < min_value){
                    u = j;
                    min_value = dist[j];
                }
            }
    
            s[u] = true; // 将选出的最小权值的定点加入s
    
            //更新path
            for(int j = 1;j <= n;j++){
                if(!s[j] && c[u][j] < max_int){
                    if(dist[u] + c[u][j] < dist[j]){
                        dist[j] = dist[u] + c[u][j];
                        prev[j] = u;
                    }
                }
            }
        }
    }
    
    void search_path(int *prev, int u, int v){
        int loc_queue[max_num], count = 1;
        loc_queue[count++] = v;
        int prev_loc = prev[v];
        while(prev_loc != u){
            loc_queue[count++] = prev_loc;
            prev_loc = prev[prev_loc];
        }
        loc_queue[count] = u;
    
        // 打印数组
        while (count >= 1){
            if(count != 1)
                cout << loc_queue[count--] << " --> ";
            else
                cout << loc_queue[count--];
        }
    
    }
    

    main 函数

    int main(int argc,char * argv[]){
    
        int dist[max_num];
        int prev[max_num];
        int c[max_num][max_num];
        int n, edge_count; //图的节点数和路经数
        int u, v, weight;
    
        cin >> n >> edge_count;
        for(int i = 1;i <= n; i++)
            for (int j = 1; j <= n ; ++j)
                c[i][j] = max_int;
        //初始化图
        for(int i = 1;i <= edge_count;i++){
            cin >> u >> v >> weight;
            if (weight < max_int){
                c[u][v] = weight;
                c[v][u] = weight;
            }
        }
    
        for(int i = 1;i <= edge_count;i++){
            dist[i] = max_int;
        }
        cout << endl;
    
        // 打印输入数据
        for (int i = 1; i <=n ; ++i) {
            for (int j = 1; j <= n; ++j)
                printf("%8d", c[i][j]);
            cout << endl;
        }
    
        Dijkstra1(n, 1, dist, prev, c);
        printf("原点到最后一点的距离为:%d
    ",dist[n]);
        cout << "路径为:" << endl;
        search_path1(prev, 1, n);
    
        return 0;
    }
    
    输入点集合
    19 35
    1 2 2
    1 3 1
    1 4 1
    1 5 1
    2 7 1
    2 10 2
    3 6 3
    3 4 3
    3 7 3
    4 5 1
    4 7 2
    4 8 1
    4 9 2
    5 8 1
    5 9 3
    6 7 1
    6 10 1
    7 11 2
    7 9 3
    8 9 1
    8 12 2
    9 13 3
    10 19 2
    11 14 1
    11 12 3
    11 16 2
    12 18 1
    12 13 1
    13 14 2
    13 17 1
    13 19 1
    14 16 1
    15 16 1
    15 17 1
    15 18 3
    18 19 1
    
    .....数据找的头秃
  • 相关阅读:
    托付和事件的使用
    在使用supervisord 管理tomcat时遇到的小问题
    无法安装vmware tools的解决方PLEASE WAIT! VMware Tools is currently being installed on your system. Dependin
    (转)Openlayers 2.X加载高德地图
    (转)openlayers实现在线编辑
    (转) Arcgis for js加载百度地图
    (转)Arcgis for js加载天地图
    (转) 基于Arcgis for Js的web GIS数据在线采集简介
    (转) Arcgis for js之WKT和GEOMETRY的相互转换
    (转)Arcgis for Js之Graphiclayer扩展详解
  • 原文地址:https://www.cnblogs.com/outxiao/p/13671978.html
Copyright © 2011-2022 走看看