概述:忙得不行的主角要从城市1(限定)坐飞机到其他城市,为了多休息所以要尽量挑距离远的城市飞(终点是随意的),而且不满足睡觉时间还不飞(兄弟你很跳啊)
这一题其实可以是说一道模板题,只不过从最短路变成了最长路,但思路是差不多的。对于我来说还是蛮好的,第一次在最短路的题目中使用了vector、队列和pair。
其中有几个要注意的点:1、路径全为单向,且除了城市1以为其他城市只有一条航线可以飞入
2、城市数量的级别比较大,邻接矩阵用不了,上邻接表
3、时间复杂度不用考虑,竟然给了30s,瞎搞吧??
以下是代码:
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std;
typedef pair<int,int> q;
const int maxn=100005;
const int maxn1=-1;
int d[maxn],C,M,flag1=-1,flag=-1;
struct edge
{
int to,cost;// to为一条路径的终点,cost为从起点到终点的消耗
};
vector<edge> ax[maxn];
void djkstal()
{
priority_queue<q> qq;//放有pair的优先队列,由于是求最大路,直接选用默认的优先队列即可
memset(d,maxn1,sizeof(d));
d[1]=0;
qq.push(q(0,1));//设置起点为1,起始距离为0
while(!qq.empty())
{
q temp=qq.top();
qq.pop();
if(temp.first<d[temp.second])//保证所求为路径中的最长路,用于剪枝(其实这个不是很懂,有大佬可以讲解一下吗?)
continue;
for(int i=0;i<ax[temp.second].size();i++)
{
edge e = ax[temp.second][i];
if(d[e.to]<d[temp.second]+e.cost)//比较大小
{
d[e.to]=d[temp.second]+e.cost;
if(d[e.to]>=M)
{
flag1=max(flag1,d[e.to]);//在符合条件的情况下每次比较最大值
}
qq.push(q(d[e.to],e.to));
}
}
}
}
int main()
{
int T;
cin>>T;
while(T--)
{ flag1=-1;
cin>>C>>M;
for(int i=0;i<C-1;i++)
{
edge e;
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
flag=max(flag,b);//用于设置清除vector的最大下标
e.to=b;
e.cost=c;
ax[a].push_back(e);
}
djkstal();
cout<<flag1<<endl;
for(int i=1;i<=flag;i++)
ax[i].clear();
}
}