公交线路
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用
文章目录
题目
给你一个数组 routes ,表示一系列公交线路,其中每个 routes[i] 表示一条公交线路,第 i 辆公交车将会在上面循环行驶。
例如,路线 routes[0] = [1, 5, 7] 表示第 0 辆公交车会一直按序列 1 -> 5 -> 7 -> 1 -> 5 -> 7 -> 1 -> … 这样的车站路线行驶。
现在从 source 车站出发(初始时不在公交车上),要前往 target 车站。 期间仅可乘坐公交车。
求出 最少乘坐的公交车数量 。如果不可能到达终点车站,返回 -1 。
示例 1:
输入:routes = [[1,2,7],[3,6,7]], source = 1, target = 6
输出:2
解释:最优策略是先乘坐第一辆公交车到达车站 7 , 然后换乘第二辆公交车到车站 6 。
示例 2:
输入:routes = [[7,12],[4,5,15],[6],[15,19],[9,12,13]], source = 15, target = 12
输出:-1
提示:
1 <= routes.length <= 500.
1 <= routes[i].length <= 105
routes[i] 中的所有值 互不相同
sum(routes[i].length) <= 105
0 <= routes[i][j] < 106
0 <= source, target < 106
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bus-routes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
提示:以下是本篇文章正文内容,下面案例可供参考
解答
代码如下(示例):
class Solution {
public:
int numBusesToDestination(vector<vector<int>>& routes, int source, int target) {
vector<int> getnext(int source){//获取当前车站可到达的站点
vector<int> nextst;
for(int i=0;i<routes.size();i++){
for(int j=0;j<routes[i].size();j++){
if(source==routes[i][j]){//找到经过当前站点的公交车
for(int j=0;j<routes[i].size();j++){
if(source!=routes[i][j]) nextst.push_back(routes[i][j]);//去掉源车站
}
break;//查看下一个公交车
}
}
}
return nextst;
}
int res=routes.size();
vector<pair<int,int>> stationCount;//记录到达当前站点时,已经乘坐的公交车次数
stationCount.push_back(source,0);//源站点,乘坐过0次
function<void(int,int)> transfer=[&](int source,int count){//输入源站点与当前已经乘坐的第几辆车
if(source==target){
if(res>count) res=count;//当前结果与历史结果取最小值
return;
}
auto nextst =getnext(source);//获取可换乘点
bool flag=false;//标志是否经过目标站点
for(int x:nextst){
for(int j=0;j<stationCount.size();j++){//遍历已经换乘过的站点
if(x==stationCount[j].first){//如果可达到站点已经选过,则判断上次乘坐时已经乘坐的公交车次数是否比本次多
//只能少,不能多,防止循环套娃
if(stationCount[j].second>count+1){//count为到达源站点已经乘坐的第几辆车
stationCount[j].second = count+1;//将较小的赋值给标记数组
transfer(x,count+1);//到达目标站点后,乘车数+1
}
flag=true;
break;//已经经过站点,跳出遍历
}
}
if(!flag){//目标站点为新站
stationCount.push_back(x,count+1);
transfer(x,count+1);
}
flag=false;
}
};
transfer(source,0);
return res;
}
};
总结
pair基本使用
链接: pair基本使用.
3,pair对象的操作
访问两个元素操作可以通过first和sencond访问:
pair<int ,double> p1;
p1.first = 1;
p1.second = 2.5;
cout<<p1.first<<' '<<p1.second<<endl;
//输出结果:1 2.5
string firstBook;
if(author.first=="James" && author.second=="Joy")
firstBook="Stephen Hero";