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 }