立志用最少的代码做最高效的表达
有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。
输入格式:
输入说明:输入数据的第1行给出4个正整数N、M、S、D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0~(N−1);M是高速公路的条数;S是出发地的城市编号;D是目的地的城市编号。随后的M行中,每行给出一条高速公路的信息,分别是:城市1、城市2、高速公路长度、收费额,中间用空格分开,数字均为整数且不超过500。输入保证解的存在。
输出格式:
在一行里输出路径的长度和收费总额,数字间以空格分隔,输出结尾不能有多余空格。
输入样例:
4 5 0 3
0 1 1 20
1 3 2 30
0 3 4 10
0 2 2 20
2 3 1 20
输出样例:
3 40
dijkstra模板题。
dijkstra求解单源最短路径的效率非常高。
步骤:
1、初始化(初始化地图,初始化起点到其他点的距离)
2、调用dijkstra:首先遍历起点周围的所有点,找到距它最短的点,加入到点集中。 其次更新从点集到其他点的最短距离。
有不懂的地方欢迎评论区留言~
#include<iostream>
#include<cstdio>
using namespace std;
const int INF = 0x3f3f3f3f;
int ways[505][505][2]; //储存路径长度,费用
int dist[505], cost[505]; //存储由st出发到各点最短路径及费用
bool visit[505] = {false};
int n,m,st,ov;
void dijkstra() {
visit[st] = true; //先将起始点加入集合。
int minpoint;
for(int i1 = 0; i1 < n; i1++) {
minpoint = n; //编号为n的城市不存在,st到n距离为inf
for(int i = 0; i < n; i++) {
if((!visit[i]) && (dist[i] < dist[minpoint]))
minpoint = i;
}
if(minpoint == n) break; //没找到,证明无连接,结束循环
visit[minpoint] = true;
for(int i = 0; i < n; i++) {
//如果该点没被访问,且以新加入节点为路径遍历得到的值更小,则更新最小值
if(!visit[i] && (dist[i] > dist[minpoint] + ways[minpoint][i][0])) {
dist[i] = dist[minpoint] + ways[minpoint][i][0];
cost[i] = ways[minpoint][i][1] + cost[minpoint];
}
//如果距离相等,但花费更小,则更新最小花费。
else if(!visit[i] && (dist[i] == dist[minpoint] + ways[minpoint][i][0])
&& (cost[i] > cost[minpoint] + ways[minpoint][i][1]))
cost[i] = (cost[minpoint] + ways[minpoint][i][1]);
}
}
}
//对地图初始化,都设为无限大。
void init_graph() {
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
ways[i][j][0] = ways[i][j][1] = INF;
}
//对从起点到任意点的距离初始化。
void init_d_c() {
for(int i = 0; i < n; i++) {
dist[i] = ways[st][i][0];
cost[i] = ways[st][i][1];
}
}
int main() {
cin >> n >> m >> st >> ov;
int a, b, c, d;
init_graph();
for(int i = 0; i < m; i++) {
cin >> a >> b >> c >> d;
ways[a][b][0] = ways[b][a][0] = c;
ways[a][b][1] = ways[b][a][1] = d;
}
init_d_c();
dist[n] = INF; //此不存在城市的最短路为INF
dist[st] = cost[st] = 0; //到自身的最短路和花费为0
dijkstra();
cout << dist[ov] << ' ' << cost[ov];
return 0;
}
耗时

修炼爱情的心酸
学会放好以前的渴望
我们那些信仰 要忘记多难
远距离的欣赏 近距离的迷惘
谁说太阳会找到月亮
别人有的爱
我们不可能模仿
修炼爱情的悲欢
我们这些努力不简单
快乐炼成泪水
是一种勇敢
几年前的幻想 几年后的原谅
为一张脸去养一身伤
别讲想念我 我会受不了这样… …

本文介绍了一个使用Dijkstra算法寻找给定出发点和目的地之间最短路径的程序。程序首先初始化地图和距离,然后通过Dijkstra算法逐步更新最短路径和最低费用。在找不到更短路径时结束,最后输出最短路径的长度和总费用。示例代码展示了算法的具体实现,并附带了输入输出示例。
1476

被折叠的 条评论
为什么被折叠?



