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

 

你可能感兴趣的:(dijkstra)