hdu 2544
求点1到点n的最短路 无向图
Sample Input
2 1 //结点数 边数
1 2 3 //u v w
3 3
1 2 5
2 3 5
3 1 2
0 0
Sample Output
3
2
堆优化Dijstra模板
1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <algorithm> 5 # include <cmath> 6 # include <queue> 7 # define LL long long 8 using namespace std ; 9 10 const int INF=0x3f3f3f3f; 11 const int MAXN=110; 12 struct qnode 13 { 14 int v; 15 int c; 16 qnode(int _v=0,int _c=0):v(_v),c(_c){} 17 bool operator <(const qnode &r)const 18 { 19 return c>r.c; 20 } 21 }; 22 struct Edge 23 { 24 int v,cost; 25 Edge(int _v=0,int _cost=0):v(_v),cost(_cost){} 26 }; 27 vector<Edge>E[MAXN]; 28 bool vis[MAXN]; 29 int dist[MAXN]; 30 int n ; 31 void Dijkstra(int start)//点的编号从1开始 32 { 33 memset(vis,false,sizeof(vis)); 34 for(int i=1;i<=n;i++)dist[i]=INF; 35 priority_queue<qnode>que; 36 while(!que.empty())que.pop(); 37 dist[start]=0; 38 que.push(qnode(start,0)); 39 qnode tmp; 40 while(!que.empty()) 41 { 42 tmp=que.top(); 43 que.pop(); 44 int u=tmp.v; 45 if(vis[u])continue; 46 vis[u]=true; 47 for(int i=0;i<E[u].size();i++) 48 { 49 int v=E[tmp.v][i].v; 50 int cost=E[u][i].cost; 51 if(!vis[v]&&dist[v]>dist[u]+cost) 52 { 53 dist[v]=dist[u]+cost; 54 que.push(qnode(v,dist[v])); 55 } 56 } 57 } 58 } 59 void addedge(int u,int v,int w) 60 { 61 E[u].push_back(Edge(v,w)); 62 } 63 64 int main () 65 { 66 // freopen("in.txt","r",stdin) ; 67 int m ; 68 while (scanf("%d %d" , &n , &m) !=EOF) 69 { 70 if (n==0 && m==0) 71 break ; 72 int u , v , w ; 73 int i , j ; 74 for(i=1;i<=n;i++) 75 E[i].clear(); 76 77 while(m--) 78 { 79 scanf("%d%d%d" , &u , &v , &w) ; 80 addedge(u,v,w) ; 81 addedge(v,u,w) ; 82 } 83 Dijkstra(1) ; 84 printf("%d\n" , dist[n]) ; 85 } 86 87 return 0 ; 88 }