![复制代码](//assets.cnblogs.com/images/copycode.gif)
1 http://poj.org/problem?id=1724
2 题目大意:单向边最短路问题,但是每条边都有一个费用,要求你的最短路方案的总的花费不能超过限制。
3
4 BFS+优先队列优化
5 因为题目要求的是在给定费用下的最短距离,所以 以距离优先建队列 广搜
6
7 #include<stdio.h>
8 #include<string.h>
9 #include<vector>
10 #include<queue>
11 using namespace std;
12 #define maxn 20000
13 #define max 0x7fffffff
14
15 struct node
16 {
17 int d;
18 int l;
19 int t;
20 int next;
21
22 }p[maxn*2];
23 struct nn
24 {
25 int v;
26 int l;
27 int mon;
28 friend bool operator <(nn a,nn b)
29 {
30 return a.l>b.l;
31 }
32 };
33 priority_queue<nn>g;
34 int num,k,n,r,vis[maxn*2],next[maxn],ans;
35
36 void add(int s,int d,int l,int t)
37 {
38 p[num].d=d;
39 p[num].l=l;
40 p[num].t=t;
41 p[num].next=next[s];
42 next[s]=num++;
43
44
45 }
46 int BFS()
47 {
48 struct nn d,b;
49 while(!g.empty())g.pop();
50 d.l=0;
51 d.mon=0;
52 d.v=1;
53 g.push(d);
54 while(!g.empty())
55 {
56 d=g.top();g.pop();
57
58 int a=d.v;
59 if(a==n)return d.l;
60 for(int i=next[a];i!=-1;i=p[i].next)
61 {
62 if(d.mon+p[i].t<=k)
63 {
64 b.l=d.l+p[i].l;
65 b.mon=d.mon+p[i].t;
66 b.v=p[i].d;
67 g.push(b);
68 }
69 }
70 }
71 return -1;
72
73 }
74
75 int main()
76 {
77 int i,s,d,l,t;
78 while(scanf("%d%d%d",&k,&n,&r)!=EOF)
79 {
80
81 num=0;
82 memset(next,-1,sizeof(next));
83 for(i=0;i<r;i++)
84 {
85 scanf("%d%d%d%d",&s,&d,&l,&t);
86 add(s,d,l,t);
87 }
88 memset(vis,0,sizeof(vis));
89
90
91 int ans=BFS();
92 printf("%d\n",ans);
93
94
95 }
96
97 }
![复制代码](//assets.cnblogs.com/images/copycode.gif)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步