最短路之Dijkstra算法

1. 邻接矩阵

 1 int cost[MAX_V][MAX_V]; //assume cost[u][v]>0
 2 int d[MAX_V];
 3 bool used[MAX_V];
 4 void Dijkstra(int s, int t, int V){
 5     for(int i=1; i<=V; i++)
 6         used[i]=false, d[i]=INT_MAX, pre[i]=0;
 7     d[s]=0;
 8     while(true){
 9         int u=-1;
10         for(int v=1; v<=V; v++){
11             if(!used[v]&&(u==-1||d[v]<d[u])) u=v;
12         }
13         if(u==-1||u==t) break;
14         used[u]=true;
15         for(int v=1; v<=V; v++){
16             if(!cost[u][v]||used[v]) continue;
17             if(d[v]>d[u]+cost[u][v])
18                 d[v]=d[u]+cost[u][v], pre[v]=u;
19         }
20     }    
21 }

2.邻接表

 1 #define X first
 2 #define Y second
 3 typedef pair<int, int> pii;
 4 typedef vector<pii> vpii;
 5 vpii G[MAX_V];
 6 int d[MAX_V];
 7 bool used[MAX_V];
 8 void Dijkstra(int s, int t, int V){
 9     for(int i=1; i<=V; i++)
10         used[i]=false, d[i]=INT_MAX, pre[i]=0;
11     d[s]=0;
12     while(true){
13         int u=-1;
14         for(int v=1; v<=V; v++){
15             if(!used[v]&&(u==-1||d[v]<d[u])) u=v;
16         }
17         if(u==-1||u==t) break;
18         used[u]=true;
19         for(int i=0; i<G[u].size(); i++){
20             int &v=G[u][i].X, &c=G[u][i].Y;
21             if(used[v]) continue;
22             if(d[v]>d[u]+c)
23                 d[v]=d[u]+c, pre[v]=u;
24         }
25     }    
26 }

 

posted @ 2015-07-25 19:05  Pat  阅读(274)  评论(0编辑  收藏  举报