poj 1724 有限制的最短距离(优先队列+链表)

题目链接:http://poj.org/problem?id=1724

题目大意:给你一个最大费用,让你在费用容许的范围内(情况下)求有源点到终点的最短距离,也就是一般的单源最小距离,不同之处在于加了费用限制。用现有的求最短距离的的方法是不可能解的。我们都知道,求最短距离的实质就是贪心(到达同样的点是所花的费用或者距离最少)我们可以这样使用优先队列,让只要到达某个点所花的费用总和小于给定的费用的所有顶点都进队列,这样每次让距离最小的出队列,如果出队列的是终点则此时的最小距离就是最费用的范围内的最短距离。

近来做题一直困惑的不是 题不会做或者没思路而是以前不习惯用邻接表,一直没用过,而这几道题呢,最终发现这几道题WA都是有重边的而且重边不能舍弃(或取最小的)因为图是有向图且要求k短路或者有限制的最短路,这些都要考虑的。没办法决定试着写下没想到这么快一直超时的变成了0ms,看来以后.............

View Code
 1 #include<iostream>
2 #include<queue>
3 #include<cstring>
4 #include<cstdio>
5 const int INF=10000;
6 using namespace std;
7 struct ss{
8 int v,len,value,next;
9 }map[10005];
10 int head[105];
11 struct tt{
12 int x,y,z;
13 friend bool operator <(tt s,tt t)
14 {
15 return s.x>t.x;
16 }
17 };
18 int n,m,v,sum;
19 int Dijkstra()
20 {
21 int i,flag=0;
22 tt p,q;
23 priority_queue<tt>Q;
24 p.x=0,p.y=0,p.z=1;
25 Q.push(p);
26 while (!Q.empty())
27 {
28 p=Q.top();
29 Q.pop();
30 if(p.z==n){
31 sum=p.x;
32 flag=1;
33 break;
34 }
35 for (i=head[p.z];i;i=map[i].next)
36 if(map[i].value+p.y<=v)
37 {
38 q.x=p.x+map[i].len;
39 q.y=map[i].value+p.y;
40 q.z=map[i].v;
41 Q.push(q);
42 }
43 }
44 if(flag)return 1;
45 return 0;
46 }
47 int main()
48 {
49 int i,x,y,z,w,N;
50 sum=0;
51 N=1;
52 scanf("%d%d%d",&v,&n,&m);
53 for (i=1;i<=m;i++)
54 {
55 scanf("%d%d%d%d",&x,&y,&z,&w);
56 if(x==y) continue;
57 map[N].v=y;
58 map[N].len=z;
59 map[N].value=w;
60 map[N].next=head[x];
61 head[x]=N++;
62 }
63 if(Dijkstra())printf("%d\n",sum);
64 else printf("-1\n");
65 return 0;
66 }
posted @ 2011-08-24 09:27  我们一直在努力  阅读(245)  评论(0编辑  收藏  举报