Dijkstra(优先队列优化)

 1 /*
 2 Dijkstra的算法思想:
 3 在所有没有访问过的结点中选出dis(s,x)值最小的x
 4 对从x出发的所有边(x,y),更新
 5 dis(s,y)=min(dis(s,y),dis(s,x)+dis(x,y))
 6 */
 7 #include <iostream>
 8 #include <cstdio>
 9 #include <queue>
10 #include <vector>
11 using namespace std;
12 const int Ni = 10000;
13 const int INF = 1<<27;
14 struct node{
15     int x,d;
16     node(){}
17     node(int a,int b){x=a;d=b;}
18     bool operator < (const node & a) const
19     {
20         if(d==a.d) return x<a.x;
21         else return d > a.d;
22     }
23 };
24 vector<node> eg[Ni];
25 int dis[Ni],n;
26 void Dijkstra(int s)
27 {
28     int i;
29     for(i=0;i<=n;i++) dis[i]=INF;
30     dis[s]=0;
31     //用优先队列优化
32     priority_queue<node> q;
33     q.push(node(s,dis[s]));
34     while(!q.empty())
35     {
36         node x=q.top();q.pop();
37         for(i=0;i<eg[x.x].size();i++)
38         {
39             node y=eg[x.x][i];
40             if(dis[y.x]>x.d+y.d)
41             {
42                 dis[y.x]=x.d+y.d;
43                 q.push(node(y.x,dis[y.x]));
44             }
45         }
46     }
47 }
48 int main()
49 {
50     int a,b,d,m;
51     while(scanf("%d%d",&n,&m),n+m)
52     {
53         for(int i=0;i<=n;i++) eg[i].clear();
54         while(m--)
55         {
56             scanf("%d%d%d",&a,&b,&d);
57             eg[a].push_back(node(b,d));
58             eg[b].push_back(node(a,d));
59         }
60         Dijkstra(1);
61         printf("%d\n",dis[n]);
62     }
63     return 0;
64 }
65 /*
66 6 6
67 1 2 2
68 3 2 4
69 1 4 5
70 2 5 2
71 3 6 3
72 5 6 3
73 */

 

 

posted @ 2012-10-04 21:43  qijinbiao1  阅读(9900)  评论(3编辑  收藏  举报