dijkstra实现的图和邻接矩阵
时间: 2025-01-10 16:11:10 浏览: 39
### Dijkstra算法在图上的实现及其与邻接矩阵的关系
#### 一、Dijkstra算法简介
Dijkstra算法是一种用于计算带权有向图中单源最短路径的经典算法。该算法通过贪心策略逐步找到从起点出发到达其他各点的最短路径长度,并能记录下具体的路径[^2]。
#### 二、基于邻接矩阵表示的图结构定义
对于给定的一个具有`n`个节点的加权无向或有向图G=(V,E),其中每条边e(i,j)都有一个非负权重w(e)=cost[i][j],则可以用大小为nxn的二维数组即邻接矩阵来存储这个图的信息。如果两个顶点之间存在一条直接相连的边,则对应位置处存入相应的代价;否则置无穷大∞表示不可达状态。此外还需要设置一个布尔型的一维数组visited[]用来标记各个结点是否已经被处理过[^1]。
```cpp
const int INF = INT_MAX; // 定义无穷大常量
int n, m;
vector<vector<int>> graph(n,vector<int>(n)); // 初始化邻接矩阵graph[n][n]
// 输入函数:读取输入数据并初始化图
void init(){
cin >> n >> m;
fill(graph.begin(),graph.end(),INF); // 将所有元素设为最大值
for(int i=0;i<m;++i){
int u,v,w;
cin >> u >> v >> w;
graph[u-1][v-1]=min(w,graph[u-1][v-1]); // 可能有多组相同uv的数据,保留最小的那个作为边权
}
}
```
#### 三、核心逻辑描述
为了方便理解,在这里给出完整的伪代码形式:
1. 设立一个集合S保存已求得最短路的顶点集;
2. 对于每一个不在S中的顶点u,维护dist[u]代表当前所知s到u之间的最短距离估计值;
3. 初始时令dist[s]=0 (因为是从自己走到自己的情况),其余均为正无穷;
4. 当还有未加入S内的顶点时循环执行如下操作:
* 找出不属于S且拥有最小dist[]值得那个顶点k;
* 把它加入到S当中去;
* 更新其它还未被收录进来的相邻节点的距离信息。
上述过程中涉及到的关键部分就是如何高效地获取下一个要扩展的最佳候选者以及怎样快速更新受影响区域的新估值。这正是借助优先队列优化后的版本能够显著提升效率的原因所在[^3]。
```cpp
struct Node {
int id,dist;
};
bool operator<(Node a,Node b){return a.dist>b.dist;}
priority_queue<Node> pq;
vector<bool> visited(n,false);
vector<int> dist(n,INF);
pq.push({source_node_id,0});
while(!pq.empty()){
auto cur=pq.top();pq.pop();
if(visited[cur.id]) continue;
visited[cur.id]=true;
for(size_t j=0;j<n;++j){
if(j!=cur.id&&!visited[j]){
if(dist[j]>dist[cur.id]+graph[cur.id][j]){
dist[j]=dist[cur.id]+graph[cur.id][j];
pq.push({static_cast<int>(j),dist[j]});
}
}
}
}
```
阅读全文
相关推荐

















