zoukankan      html  css  js  c++  java
  • HDU 2544 最短路

    题目描述

    在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?

    Input
    输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
    输入保证至少存在1条商店到赛场的路线。
    Output
    对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
    Sample Input
    2 1
    1 2 3
    3 3
    1 2 5
    2 3 5
    3 1 2
    0 0
    Sample Output
    3
    2

    题目分析

    最短路问题。用的是Dijkstra算法,当时还没看过SPFA算法。不过能用就行。

    DijKstra算法的大概意思就是用一个集合来存储单源点到其余个点的最短距离。去找距离这个集合最短距离的点,不断更新这个集合,直到这个集合吞并整个图。

    代码

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    
    using namespace std;
    
    #define MAXV 105
    #define INF 0x3f3f3f
    int cost[MAXV][MAXV];
    int d[MAXV]; //从集合出发的到x顶点的最小值
    bool used[MAXV];
    int V, E;
    
    int Min(int a, int b) {
        return a < b ? a : b;
    }
    
    void dijkstra(int s) {
        for (int i = 1; i <= V; i++) {
            d[i] = cost[1][i];
            used[i] = false;
        }
        d[s] = 0;
    
        while (true) {
            int v = -1;
            //找到权值最小的顶点
            for (int u = 1; u <= V; u++) {
                if (!used[u] && (v == -1 || d[u] < d[v])) {
                    v = u;
                }
            }
            if (v == -1) break;
            used[v] = true;
            //更新插入新节点v后集合X到那些顶点的距离。
            for (int u = 1; u <= V; u++) {
                d[u] = Min(d[u], d[v] + cost[v][u]);
            }
        }
    }
    
    
    int main() {
        while(scanf("%d%d", &V, &E)) {
            if (!V && !E) break;
    
            for (int i = 1; i <= V; i++)
                for (int j = 1; j <= i; j++) {
                    if (i == j) cost[i][j] = 0;
                    else cost[i][j] = cost[j][i] = INF; 
                }
                    
    
            int u, v, val;
            for (int i = 0; i < E; i++) {
                scanf("%d%d%d", &u, &v, &val);
                cost[u][v] = cost[v][u] = val;
            }
            dijkstra(1);
            printf("%d
    ", d[V]);
        }
        return 0;
    }
    
  • 相关阅读:
    html+css 笔记
    JS随手笔记
    JQ几个淡入淡效果
    AngularJS编译阶段应分为两个阶段
    JavaScript 原型链的理解
    js继承的6种方式
    什么是跨域?跨域解决方法
    computed (计算属性) 和 methods (方法) 的区别
    谈谈vue生命周期
    基本类型有哪几种?null 是对象吗?基本数据类型和复杂数据类型存储有什么区别?
  • 原文地址:https://www.cnblogs.com/wudongwei/p/9370795.html
Copyright © 2011-2022 走看看