最短路之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 }