`

hdu 2544 最短路(最简单的最短路:floyd or dijkstra or spfa)

阅读更多

最短路

Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 7471    Accepted Submission(s): 3179

Problem Description
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的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
 

        最最最简单的最短路问题!写了三个常用求最短路的算法:floyd、djikstra、spfa,都能轻松解决!

链接:http://acm.hdu.edu.cn/showproblem.php?pid=2544

代码:

#include <iostream>
#include <stdio.h>
#include <memory.h>
#include <queue>
using namespace std;

const int N = 105;
const int INF = 99999999;

int map[N][N], dist[N];
bool visit[N];
int n, m;

void init()     //初始化
{
    int i, j;
    for(i = 1; i < N; i++)
    {
        for(j = 1; j < N; j++)
        {
            if(i == j) map[i][j] = 0;
            else map[i][j] = map[j][i] = INF;
        }
    }
}

void input()    //输入函数
{
    int vi, vj, cost;
    while(m--)
    {
        scanf("%d %d %d", &vi, &vj, &cost);
        if(cost < map[vi][vj])
            map[vi][vj] = map[vj][vi] = cost;
    }
}

void floyd()    //Floyd算法
{
    int i, j, k;
    for(k = 1; k <= n; k++)     //k为中间点
        for(i = 1; i <= n; i++)
            for(j = 1; j <= n; j++)
                if(map[i][k] + map[k][j] <  map[i][j])
                     map[i][j] = map[i][k] + map[k][j];
}

void dijk()     //Dijkstra算法
{
    int i, j, next, MIN;
    memset(visit, false, sizeof(visit));
    for(i = 1; i <= n; i++) dist[i] = INF;
    dist[1] = 0;
    for(i = 1; i <= n; i++)
    {
        MIN = INF;
        for(j = 1; j <= n; j++)
            if(!visit[j] && dist[j] <= MIN)
                MIN = dist[next=j];
        if(MIN == INF) break;
        visit[next] = true;
        for(j = 1; j <= n; j++)
            if(!visit[j] && dist[j] > dist[next] + map[next][j])
                dist[j] = dist[next] + map[next][j];
    }
}

void spfa()     //SPFA算法
{
    int i, now;
    memset(visit, false, sizeof(visit));
    for(i = 1; i <= n; i++) dist[i] = INF;
    dist[1] = 0;
    queue<int> Q;
    Q.push(1);
    visit[1] = true;
    while(!Q.empty())
    {
        now = Q.front();
        Q.pop();
        visit[now] = false;
        for(i = 1; i <= n; i++)
        {
            if(dist[i] > dist[now] + map[now][i])
            {
                dist[i] = dist[now] + map[now][i];
                if(visit[i] == 0)
                {
                    Q.push(i);
                    visit[i] = true;
                }
            }
        }
    }
}

int main()
{
    while(scanf("%d %d", &n, &m))
    {
        if(!n || !m) break;
        init();
        input();
        //floyd();
        //dijk();
        spfa();
        //printf("%d\n", map[1][n]);
        printf("%d\n", dist[n]);
    }

    return 0;
}

 
 

0
2
分享到:
评论

相关推荐

    最短路(HDU-2544).rar

    1. Dijkstra算法:Dijkstra算法是最常用且基础的单源最短路算法,它使用贪心策略,逐步扩展从源节点s出发的最短路径树。算法保证了每次扩展的都是当前未访问节点中距离源节点最近的一个,最终得到s到所有节点的最短...

    Dijkstra算法解HDU1874

    **Dijkstra算法解HDU1874** Dijkstra算法是一种经典的图论算法,由荷兰计算机科学家艾兹格·迪科斯彻在1956年提出,主要用于解决单源最短路径问题。在这个问题中,我们需要从一个指定的起点(源节点)出发,找到...

    HDU-EID-V2-核心板1

    在本话题中,我们关注的是一个名为"HDU-EID-V2-核心板1"的特定设计,它涉及到STM32的核心组件、接口、电源管理和调试配置。 首先,核心板设计中提到了F103和F207两个型号的STM32芯片。F103和F207属于STM32的不同...

    SPFA带负权的最短路径算法

    SPFA 算法是 Bellman-Ford算法 的队列优化算法的别称,通常用于求含负权边的单源最短路径,以及判负权环。SPFA 最坏情况下复杂度和朴素 Bellman-Ford 相同,为 O(VE)。

    HDU最全ac代码

    "HDU最全ac代码"这个压缩包很可能是包含了在HDU平台上解题通过的完整源代码集合,旨在帮助学习者理解和掌握各种算法,提升编程解决问题的能力。 首先,我们来了解一下ACM/ICPC比赛。这是一项全球性的编程竞赛,参赛...

    hdu排序练习

    5. **图论算法**:包括深度优先搜索(DFS)、广度优先搜索(BFS)、最短路径算法(如Dijkstra算法、Floyd算法)、最小生成树算法(如Prim算法、Kruskal算法)等,用于解决图相关的复杂问题。 ### 知识点三:实战...

    Hdu1000—2169部分代码

    4. **图论算法**:最短路径算法(Dijkstra、Floyd-Warshall)、拓扑排序、最小生成树(Prim、Kruskal)等。 5. **数学方法**:模运算、数论、组合数学等。 6. **字符串处理**:KMP匹配、Z算法、后缀数组、AC自动机等...

    hdu1250高精度加法

    ### hdu1250高精度加法 #### 背景介绍 在计算机科学与编程竞赛中,处理大整数运算(特别是加法、减法、乘法等)是常见的需求之一。当数字的位数超过了标准数据类型(如`int`、`long`等)所能表示的最大值时,就需要...

    hdu.rar_hdu

    HDU(杭州电子科技大学在线评测系统)是一个深受程序员喜爱的在线编程练习平台,它提供了丰富的算法题目供用户挑战,帮助他们提升编程技能和算法理解能力。"hdu.rar_hdu"这个压缩包文件很可能是某位程序员整理的他在...

    hdu2000-2014ac代码

    5. **图论**:图的遍历(深度优先搜索DFS和广度优先搜索BFS)、最小生成树(Prim和Kruskal算法)、最短路径(Dijkstra和Floyd算法)等。在解决网络问题、旅行商问题等时,图论知识至关重要。 6. **递推和动态规划**...

    最短路径 贪心实现代码

    最短路径 贪心实现代码 hdu 最短路 dijkstra 算法

    HDU题目java实现

    【标题】"HDU题目java实现"所涉及的知识点主要集中在使用Java编程语言解决杭州电子科技大学(HDU)在线评测系统中的算法问题。HDU是一个知名的在线编程竞赛平台,它提供了大量的算法题目供参赛者练习和提交解决方案...

    hdu题目分类

    7. **图算法(Graph Algorithms)**:最短路径算法(Dijkstra、Floyd-Warshall)、最小生成树算法(Kruskal、Prim)等,用于解决图上的各种问题。 ### 编程语言与工具 1. **C/C++**:由于其执行效率高,是算法竞赛和系统...

    HDU算法讲解的PPT

    2. **图论与网络流**:可能涉及最小生成树(Prim或Kruskal算法)、最短路径(Dijkstra或Floyd-Warshall算法)、网络流(Ford-Fulkerson或Edmonds-Karp算法)等,这些都是解决复杂问题的利器,常见于竞赛编程和实际...

    HDU DP动态规划

    【标题】"HDU DP动态规划"涉及到的是在算法领域中的动态规划(Dynamic Programming,简称DP)技术,这是解决复杂问题的一种高效方法,尤其适用于有重叠子问题和最优子结构的问题。动态规划通常用于优化多阶段决策...

    HDU_2010.rar_hdu 2010_hdu 20_hdu acm20

    【标题】"HDU_2010.rar"是一个压缩包文件,其中包含了与"HDU 2010"相关的资源,特别是针对"HDU ACM20"比赛的编程题目。"hdu 2010"和"hdu 20"可能是该比赛的不同简称或分类,而"hdu acm20"可能指的是该赛事的第20届...

    HDU acm-PPT课件

    【ACM入门与提高:HDU ACM竞赛课程详解】 ACM(国际大学生程序设计竞赛,International Collegiate Programming Contest,简称ICPC或ACM/ICPC)是一项全球性的竞赛,旨在激发大学生对计算机科学的兴趣,提升他们的...

    ACM HDU题目分类

    ACM HDU 题目分类 ACM HDU 题目分类是指对 HDU 在线判题系统中题目的分类,总结了大约十来个分类。这些分类将有助于编程选手更好地理解和解决问题。 DP 问题 DP(Dynamic Programming,动态规划)是一种非常重要...

    杭电HDU ACM培训课件

    1. **基础算法**:这是ACM编程的基础,包括排序(快速排序、归并排序、堆排序等)、搜索(二分查找、深度优先搜索、广度优先搜索)、图论(最短路径算法如Dijkstra和Floyd-Warshall,最小生成树如Prim和Kruskal)等...

    HDU+2000-2099+解题报告.zip

    2. **图论算法**:包括最短路径问题(Dijkstra算法、Floyd算法)、最小生成树(Prim算法、Kruskal算法)等。解题报告会解析图结构,展示如何构建和遍历图,以找到最优解决方案。 3. **贪心算法**:贪心算法在每一步...

Global site tag (gtag.js) - Google Analytics