一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第18天,点击查看活动详情。
题目信息描述
厌倦了农场寒冷的冬季天气,奶牛贝茜计划飞往一个温暖的目的地度假。
不幸的是,她发现只有一家航空公司,博维尼亚航空,愿意向奶牛出售机票,而且这些机票的结构有些复杂。
博维尼亚航空公司拥有 N 架飞机,每架飞机都在由两个或多个城市组成的特定“航线”上飞行。
例如,一架飞机可能从城市 1 起飞,然后飞到城市 5,然后飞到城市 2,最后飞到城市 8。
没有一个城市会在一条航线上出现多次。
如果贝茜选择了一条航线,那么她可以在航线上的任何城市登机,然后在航线上的任何城市下飞机。
她不需要在航线的第一个城市登机或在最后一个城市下机。
每条航线都有一定的费用,只要贝茜乘坐了某个航线,不论乘坐时途径的城市有多少,都需要支付全部的航线费用。
贝茜想找到从她所在的农场(在 A 市)到热带目的地(B 市)的最便宜的旅行方式。
但她不想被复杂的行程搞糊涂,所以她只想搭乘一条航线。
请确定她需要支付的最低费用。
输入格式
第一行包含三个整数 A,B,N。
接下来 2N 行,每两行描述一条航线,第一行包含航线的乘坐费用以及航线途径的城市数量。第二行包含按航线顺序排列的城市列表。
输出格式
输出贝茜从 AA 到 BB 所需要支付的最低费用。
如果无法到达目的地,则输出 −1−1。
数据范围
1≤N≤500, 1≤ 航线费用 ≤1000, 1≤ 航线途径城市数量 ≤500, 城市编号范围 [1,10000]。
输入样例:
1 2 3
3 3
3 2 1
4 4
2 1 4 3
8 5
4 1 7 8 2
输出样例:
8
样例解释
虽然存在一条搭乘两次航线的更便宜的路线(先乘坐第二条航线从城市 1 飞往城市 3,再乘坐第一条航线从城市 3 飞往城市 2),但是贝茜只想乘坐一条航线,所以她只能乘坐第三条航线,花费为 8。
思路
这道题主要考察模拟和枚举。我们可以使用一个二维数组来存储每一条航线的信息(途径的城市以及总费用),然后进行遍历每条航线的每个城市,如果该航线可以从指定的起点到终点,我们就用该条路线的总费用更新答案费用。
注意:这里还需要判断每条线路都不能满足从起点到终点的情况。
代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 10100;
int q[N][N];
int su[N];
int main()
{
int a, b , N;
cin >> a >> b >> N;
for(int i = 0;i < N;i ++)
{
int sum, num;
cin >> sum >> num;
su[i] = sum;
q[i][0] = num;
for(int j = 1;j <= num;j ++) cin >> q[i][j];
}
int res = 10100;
bool ans = false;
for(int i = 0;i < N;i ++)
{
int x = 0, y = 0;
for(int j = 1;j <= q[i][0];j ++){
if(q[i][j] == a) x = j;
if(q[i][j] == b) y = j;
}
//cout << "x = " << x << "y = " << y << endl;
if(x && y && y - x > 0 && res > su[i]){
ans = true;res = su[i];
}
//cout << res << endl;
}
if(ans)
cout << res << endl;
else cout << -1 << endl;
return 0;
}