【题目来源】:https://vjudge.net/problem/POJ-1724
【题意】
给出旅游经费k,每一条路都要花去一定的经费,在保证能够从点1到点n的情况下,求最短路。
【思路】
这是我的最短路专题里最后一道题了。总体感觉这几天做的还行,学到了不少东西。有苦有乐。
第一次这么在最短路里用优先队列,然后,恍然大悟还可以这么写。
这道题前提保证能够到达n点,并且还要是最短路,那么就维护两个最小值,一个是距离,在队列里从前往后层递增趋势,其次,如果距离一样,那么按照花费排序,花费小的优先,那么每次都用最小的去更新,就可以得出正确答案了。
【代码】
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
int k,n,m;
struct pp
{
int v,w;
int nexx,val;
}edge[10000+10];
int first[103];
struct num
{
int dis,cost,x;
bool operator<(const num &a)const
{
if(dis!=a.dis)
{
return dis>a.dis;
}
return cost>a.cost;
}
};
void spfa()
{
priority_queue<num> q;
num q1,q2;
q1.dis=q1.cost=0;
q1.x=1;
q.push(q1);
while(!q.empty())
{
q2=q.top();
q.pop();
if(q2.x==n)
{
printf("%d\n",q2.dis);
return;
}
for(int i=first[q2.x];i!=-1;i=edge[i].nexx)
{
if(q2.cost+edge[i].val<=k)
{
q1.x=edge[i].v;
q1.dis=q2.dis+edge[i].w;
q1.cost=q2.cost+edge[i].val;
q.push(q1);
}
}
}
}
int main()
{
scanf("%d",&k);
scanf("%d",&n);
scanf("%d",&m);
for(int i=1;i<=n;i++)
first[i]=-1;
for(int i=1;i<=m;i++)
{
int u,v,w,val;
scanf("%d%d%d%d",&u,&v,&w,&val);
edge[i].nexx=first[u];
first[u]=i;
edge[i].v=v;
edge[i].w=w;
edge[i].val=val;
}
flag=0;
spfa();
}