第一次广搜从终点站倒着往起点搜,这一次是判断搭乘某车能不能到终点站,用Node里的j标记 随后正着广搜,那么什么时候将边加入呢?当这个边的终点站能到终点并且有换乘选择的时候加入。 这里我筛了两次,第一次不管换乘,但是记录时间到一个set里,并且把边储存到另一个数组里,第二次跟最大值比较等于的话就不能加入了
#include <bits/stdc++.h>
using namespace std;
struct Node {int start,end,cost,time1,time2;bool j;};
struct re {struct Node node;int money;};
vector tu[501][501];
int time_tiqu(string k) { int i = 0; int time1 = 0; while(k[i] != ':') { time1 *= 10; time1 += k[i] - '0'; i++;
} time1 *= 60; int time2 = 0;i++; while(i < k.size()) { time2 *= 10; time2 += k[i] - '0'; i++; } return time1 + time2;
} bool cmp(const Node &a,const Node &b) { if(a.time1 != b.time1) return a.time1 < b.time1;
else
return a.cost < b.cost;
} int main()
{
int n,m;cin >> n >> m;
int x,y,c;
string xx,yy;
queue <struct Node> p;
int mark = 0;
for(int i = 0;i < m;i++)
{
cin >> x >> y >> c >> xx >> yy;
int ts_1 = time_tiqu(xx),td_1 = time_tiqu(yy);
/*cout << ts_1 << " " << td_1 << endl;*/
tu[x][y].push_back({x,y,c,ts_1,td_1,false});
}
tu[0][1].push_back({0,1,0,-30,-30,false});
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= n;j++)
{
sort(tu[i][j].begin(),tu[i][j].end(),cmp);
}
}
for(int i = 1;i <= n;i++)
{
for(int j = 0;j < tu[i][n].size();j++)
{
tu[i][n][j].j = true;
p.push(tu[i][n][j]);
}
}
while (!p.empty())
{
struct Node temp = p.front();p.pop();
for(int i = 1;i<= n;i++)
{
for(int j = 0;j <tu[i][temp.start].size();j++)
{
if(tu[i][temp.start][j].time2 + 30 <= temp.time1)
{
if(!tu[i][temp.start][j].j)
{
tu[i][temp.start][j].j = true;
p.push(tu[i][temp.start][j]);
}
}
}
}
}
queue q;
q.push({tu[0][1][0],0});
int result = INT_MAX - 1;
while (!q.empty())
{
struct re temp = q.front();q.pop();
if(temp.node.end == n)
{
result = min(result,temp.money);
}
vector<struct Node> mid;
set<int> t_mark;
int mark = 0;
for(int i = 1;i <= n;i++)
{
for(int j = 0;j < tu[temp.node.end][i].size();j++)
{
if((tu[temp.node.end][i][j].j) && (temp.node.time2 + 30 <= tu[temp.node.end][i][j].time1))
{
mid.push_back(tu[temp.node.end][i][j]);
t_mark.insert(tu[temp.node.end][i][j].time1);
}
}
}
for(int i = 0;i < mid.size();i++)
{
if(mid[i].time1 < (*t_mark.rbegin()))
{
q.push({mid[i],mid[i].cost + temp.money});
}
}
}
if(result != INT_MAX - 1)
{cout << result;}
else
{cout << -1;}
return 0;
}

京公网安备 11010502036488号