poj 2449 求k短路

题目大意就不用说了,做题方法就是前面我说过的A*算法,但这道题我WA了无数次,首先有重边即使你意识到有重边,用邻接表来存储也不一定对,也就是要说的其次了在用Dijkstra的时候在初始化dist[]时更应该注意,要选重边中的最小那一条边,原因你细想下就知道了因为后面要用到A*算法,这该算法的h[x]表示的是该点到目的地的最短距离(这样表示不是太恰当),而Dijkstra算法每次选最小的边如果在初始化时存的不是最小的(但它是目前最小的)那结果可想而知!!!

View Code
  1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include<queue>
5 using namespace std;
6 struct node{
7 friend bool operator<(node n1,node n2)
8 {
9 return n1.x>n2.x;
10 }
11 int x;
12 int y;
13 int z;
14 };
15 struct tt {
16 int y,value;
17 int next;
18 }map[1000005],map1[1000005];
19 int head[1005];
20 int head1[1005];
21 int dist[1005],vist[1005];
22 int n,sum;
23 void prim(int s)
24 {
25 int i,v,mi,j,gg;
26 for (i=1;i<=n;i++)
27 {
28 dist[i]=10000;
29 vist[i]=0;
30 }
31
32 for (i=head1[s];i;i=map1[i].next)
33 {
34 if(dist[map1[i].y]>map1[i].value)
35 dist[map1[i].y]=map1[i].value;
36 }
37 vist[s]=1;
38 dist[s]=0;
39 for (i=1;i<n;i++)
40 {
41 mi=10000;
42 for (j=1;j<=n;j++)
43 if(!vist[j]&&dist[j]<mi)
44 {
45 mi=dist[j];
46 v=j;
47 }
48 vist[v]=1;
49 for (gg=head1[v];gg;gg=map1[gg].next)
50 {
51 int ttt=map1[gg].y;
52 if (!vist[ttt]&&dist[ttt]>dist[v]+map1[gg].value)
53 dist[ttt]=dist[v]+map1[gg].value;
54 }
55 }
56 }
57 void BFS(int s,int t,int k,int len)
58 {
59 int i,v,g;
60 g=0;
61 priority_queue<node>Q;
62 node p,w;
63 w.x=dist[s];
64 w.y=s;
65 w.z=len;
66 Q.push(w);
67 while (!Q.empty())
68 {
69 p=Q.top();
70 if(p.y==t)g++;
71 if(g==k){
72 sum=p.x;
73 break;
74 }
75 Q.pop();
76 v=p.y;
77 for (i=head[v];i;i=map[i].next)
78 {
79 w.z=p.z+map[i].value;
80 w.x=w.z+dist[map[i].y];
81 w.y=map[i].y;
82 Q.push(w);
83 }
84 }
85 while (!Q.empty())
86 {
87 Q.pop();
88 }
89 }
90 int main()
91 {
92 int i,j,m,s,t,k,x,y,z,N,W;
93
94 while(scanf("%d%d",&n,&m)!=EOF)
95 {
96 sum=0;
97 W=N=1;
98 memset(head,0,sizeof(head));
99 memset(head1,0,sizeof(head1));
100 for (i=1;i<=m;i++)
101 {
102 scanf("%d%d%d",&x,&y,&z);
103
104
105 map[N].y=y;
106 map[N].value=z;
107 map[N].next=head[x];
108 head[x]=N++;
109
110 }
111 scanf("%d%d%d",&s,&t,&k);
112 for (i=1;i<=n;i++)
113 for (j=head[i];j;j=map[j].next)
114 {
115
116 map1[W].y=i;
117 map1[W].value=map[j].value;
118 map1[W].next=head1[map[j].y];
119 head1[map[j].y]=W++;
120
121 }
122 if(s==t)k++;
123 prim(t);
124 BFS(s,t,k,0);
125 if(sum==0)printf("-1\n");
126 else printf("%d\n",sum);
127 }
128 return 0;
129 }
posted @ 2011-08-24 11:12  我们一直在努力  阅读(384)  评论(0编辑  收藏  举报