[HDOJ2544]最短路

最短路

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

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

给出非常朴素的Dijkstra算法代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 const int N = 105, INF=0xffffff;
 6 int dis[N];
 7 int w[N][N];
 8 int vis[N];
 9 int n, m;
10 void Dij(int src)
11 {
12     for(int i = 1; i <= n; i++)
13     {
14         dis[i] = INF;
15     }
16     dis[src] = 0;
17     memset(vis, 0, sizeof(vis));
18     for(int i = 1; i <= n; i++)
19     {
20         int u = -1;
21         for(int j = 1; j <= n; j++)
22         {
23             if(!vis[j])
24             {
25                 if(u == -1 || dis[j] < dis[u])
26                 {
27                     u = j;
28                 }
29             }
30         }
31         vis[u] = 1;
32         for(int j = 1; j <= n; j++)
33         {
34             if(!vis[j])
35             {
36                 int tmp = dis[u] + w[u][j];
37                 if(tmp < dis[j])
38                 {
39                     dis[j] = tmp;
40                 }
41             }
42         }
43     }
44 }
45 int main()
46 {
47     int a, b, c;
48     while(scanf("%d %d", &n, &m) != EOF && n+m)
49     {
50         for (int i = 1; i <= n; i++)
51         {
52             w[i][i] = INF;
53             for(int j = i + 1; j <= n; j++)
54             {
55                 w[i][j] = w[j][i] = INF;
56             }
57         }
58         for(int i = 0; i < m; i++)
59         {
60             scanf("%d %d %d", &a, &b, &c);
61             w[a][b] = w[b][a] = c;
62         }
63         Dij(1);
64         printf("%d\n", dis[n]);
65     }
66 }

时间: 2024-10-10 12:21:25

[HDOJ2544]最短路的相关文章

hdoj2544 最短路(Dijkstra || Floyd || SPFA)

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2544 思路 最短路算法模板题,求解使用的Dijkstra算法.Floyd算法.SPFA算法可以当做求解最短路问题的模板使用. 代码 Dijkstra算法: 1 #include <algorithm> 2 #include <iostream> 3 #include <cstring> 4 #include <cstdio> 5 using namespace

hdoj-2544 最短路【dijkstra】

题目http://acm.hdu.edu.cn/showproblem.php?pid=2544 模板题 #include<cstdio> #include<cstring>//memset #include<algorithm>//min #define INF 0x3f3f3f3f #define maxn 110 using namespace std;//algorithm int n,m,map[maxn][maxn],dis[maxn];//map[][]两

最短路算法 -- SPFA模板

一.算法步骤 建立一个队列,初始时队列里只有起始点,再建立一个数组记录起始点到所有点的最短路径(该数组的初始值要赋为极大值,该点到它本身的路径赋为0,下面的模板中该数组为dist[]).然后执行松弛操作,用队列里有的点作为起始点去刷新到所有点的最短路,如果刷新成功且被刷新点不在队列中则把该点加入到队列最后.重复执行直到队列为空. 二.算法模板 1 struct Edge 2 { 3 int s, e, dist; //边的起点.终点.长度 4 5 Edge() {} 6 Edge(int s,

hdu3461Marriage Match IV 最短路+最大流

//给一个图.给定起点和终点,仅仅能走图上的最短路 //问最多有多少种走的方法.每条路仅仅能走一次 //仅仅要将在最短路上的全部边的权值改为1.求一个最大流即可 #include<cstdio> #include<cstring> #include<iostream> #include<queue> #include<vector> using namespace std ; const int inf = 0x3f3f3f3f ; const

UESTC30-最短路-Floyd最短路、spfa+链式前向星建图

最短路 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的T-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据. 每组数据第一行是两个整数NN ,MM (N≤100N≤100 ,M≤10000M≤1000

ACM: HDU 2544 最短路-Dijkstra算法

HDU 2544最短路 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<

ACM/ICPC 之 昂贵的聘礼-最短路解法(POJ1062)

//转移为最短路问题,枚举必经每一个不小于酋长等级的人的最短路 //Time:16Ms Memory:208K #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define INF 0x3f3f3f3f #define MAX 105 int lim, n; int p[M

图论(A*算法,K短路) :POJ 2449 Remmarguts&#39; Date

Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 25216   Accepted: 6882 Description "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly touching his little ducks' head, h

hdu4725 拆点+最短路

题意:有 n 个点,每个点有它所在的层数,最多有 n 层,相邻两层之间的点可以互相到达,消耗 c (但同一层并不能直接到达),然后还有一些额外的路径,可以在两点间互相到达,并且消耗一定费用.问 1 点到 n 点的最小花费 将每一层拆成两个点,分别为进入层和出发层,然后相邻层的出发层可以指向进入层,花费 c,每个点可以到达其出发层,而进入层可以到达该点,花费 0 ,最后建立其余双向边,最短路 1 #include<stdio.h> 2 #include<string.h> 3 #in