标签:des style color os strong io for ar
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 10742 | Accepted: 3949 |
Description
Input
Output
Sample Input
5 6 7 1 2 2 3 2 4 3 3 3 4 2 4 1 3 4 1 4 6 2 1 3 5 2 0 5 4 3 2
Sample Output
11
解决方案:此题我是这样做的,用上优先队列,在费用可行的情况下,不断松弛路径。其实也相当于bfs+优先队列。首先路径最短的优先级最高,其次是花费,通过不断的把符合费用要求能到达的点加入优先队列,每次出队即更新能到达的点。最后如果出队的点是N,算法结束,得到的路径既是在花费符合的情况下最短的,这题考察的是能不能深刻理解dijkstra的原理,并运用。
code:#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #define MMAX 10003 #define Max 103 using namespace std; int K,N,R,k; int head[Max]; struct edge { int from,to,len,cost; int next; } E[MMAX]; struct stay { int dis,cost,x; bool operator<(const stay &s)const { if(dis!=s.dis) { return dis>s.dis; } else return cost>s.cost; } }; void add(int from,int to,int len,int cost) { E[k].from=from; E[k].to=to; E[k].len=len; E[k].cost=cost; E[k].next=head[from]; head[from]=k++; } int dijkstra() { priority_queue<stay> Q; stay in; in.dis=0,in.cost=0,in.x=1; Q.push(in); while(!Q.empty()) { stay out=Q.top(); if(out.x==N) {return out.dis;} Q.pop(); for(int v=head[out.x]; v!=-1; v=E[v].next) { if(out.cost+E[v].cost<=K) { stay temp; temp.x=E[v].to; temp.dis=out.dis+E[v].len; temp.cost=out.cost+E[v].cost; Q.push(temp); } } } } int main() { while(~scanf("%d%d%d",&K,&N,&R)) { memset(head,-1,sizeof(head)); k=0; int from,to,len,cost; for(int i=0; i<R; i++) { scanf("%d%d%d%d",&from,&to,&len,&cost); add(from,to,len,cost); } printf("%d\n",dijkstra()); } return 0; }
ROADS+dijkstra的灵活运用+POJ,布布扣,bubuko.com
标签:des style color os strong io for ar
原文地址:http://blog.csdn.net/u012870383/article/details/38315953