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 */