poj1724ROADS(优先队列+BFS 有条件的最短路)
http://poj.org/problem?id=1724
/*poj1724ROADS
题意是在一定的coins的限制下的最短路径;可以用Dijkstra的变形(BFS+优先队列);
用邻接边来存储边;
松弛过程中用优先队列(边的长度短的优先)来存储边,将符合条件(coins限制)的边都加入优先队列;
直到找到延伸到最后一个顶点即可终止循环; 因为最先到达的一定是最短路径,在coins的限制条件下;
*/
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define MAXN 111
int len[MAXN*MAXN],w[MAXN*MAXN],head[MAXN*MAXN],next[MAXN*MAXN],u[MAXN*MAXN],v[MAXN*MAXN];
int coin,n,m;
struct node
{
int v,dis,cost;
node(int _v,int _dis,int _cost)
{
v=_v,dis=_dis,cost=_cost;
}
friend bool operator <(const node&a,const node&b)
{
if(a.dis!=b.dis)return a.dis>b.dis;
return a.cost>b.cost;
}
};
int BFS()
{
priority_queue<node> pq;
pq.push(node(1,0,0));
while(!pq.empty())
{
node tmp=pq.top();
pq.pop();
if(tmp.v==n)return tmp.dis;
for(int e=head[tmp.v];e>=0;e=next[e])
{
if(tmp.cost+w[e]<=coin)//小于coin
{
pq.push(node(v[e],tmp.dis+len[e],tmp.cost+w[e]));
}
}
}
return -1;
}
int main()
{
while(scanf("%d%d%d",&coin,&n,&m)==3)
{
memset(head,-1,sizeof(head));
for(int i=0;i<m;i++)
{
scanf("%d%d%d%d",&u[i],&v[i],&len[i],&w[i]);
next[i]=head[u[i]];
head[u[i]]=i;
}
printf("%d\n", BFS());
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步