CSU-1830 FarAway

概述:忙得不行的主角要从城市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();
    }

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值