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

 

转载于:https://www.cnblogs.com/Patt/p/4676402.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值