CSU-1830 FarAway

来源:互联网 发布:销售订单软件 编辑:程序博客网 时间:2024/06/06 00:11
概述:忙得不行的主角要从城市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