本文主要是介绍每天一个小题目——小赛打车,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
- 题目描述
小赛打车 时间限制:C/C++语言 1000MS;其他语言 3000MS 内存限制:C/C++语言 32768KB;其他语言 557056KB题目描述: 小赛要去位于 A 市的小码家。小赛来到 A 市的车站,买了一张 A 市的地图,他发现这里的地形非常的复杂。A 市的街道一共有 N 个路口,M 条道路,每条道路连接着两个路口,并且有各自的长度。目前,小赛所在的车站位于编号为 1 的路口,而小码家所在的路口编号为 N,小赛准备打出租车去,当然,路程越小,付的钱就越少。问题摆在眼前:请帮助小赛寻找一条最短路径,使得他可以花最少的钱到达小码家。
样例输入、输出:
输入 第一行有两个整数 N, M (N≤1000) 分别代表路口数和街道数。以下有 M 行用以描述各个街道,每行有三个数字 P1, P2, L,分别代表此街道起点编号,此街道终点编号以及此街道的长度。保证所给的数据可以构成连通图。
输出
一行一个整数,说明最短路径的长度。
样例输入
6 7
1 2 1
1 3 5
1 4 2
4 6 10
2 5 3
3 5 8
5 6 7
样例输出
11
代码如下:
#include<iostream>using namespace std;int a[1000][1000] = {0};
int d[1000][1000] = {0};int next(int n, int m){ // 循环迭代累加路径 if (n < m){for (int j = 1; j <= m; ++j)if (a[n][j] == 1)return d[n][j] + next(j,m);}elsereturn 0;
}int main(){int N,M;cin >> N >> M;int max = 0;while(M--){ // 道路数据录入 int p1,p2,l;cin >> p1 >> p2 >> l;a[p1][p2] = 1;d[p1][p2] = l;if (p2 > max)max = p2;}int cnt = 0;for (int j = 1; j <= max; ++j)if (a[1][j] == 1)++cnt; // 从 1 出发的路有几条 int *p = new int[cnt+1]; // 存储路径的动态数组 for (int i = 1; i <= cnt; ++i) // 数组初始化 p[i] = 0;int num = 1;for (int j = 1; j <= max; ++j ) // 从 路口 1 开始寻找{int sum = 0; // 路程总数 if (a[1][j] == 1){p[num] += d[1][j] + next(j,max);// cout << p[num] << " "; // 所有可能路径长度 ++num;}} int count = p[1]; // 找到最小路径 for (int i = 2; i <= cnt; ++i)if (p[i] != 0 && p[i] < count)count = p[i];delete [] p; // 释放内存 cout << count << endl;return 0;
}
这篇关于每天一个小题目——小赛打车的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!