- 题目描述
小赛打车 时间限制: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);
}
else
return 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;
}