849. Dijkstra求最短路 I

本文介绍了一个使用Dijkstra算法解决最短路径问题的C++程序实例。该程序通过读取顶点数和边的数量来构建图,并利用Dijkstra算法计算从起点到所有其他点的最短路径。最终输出从起点到终点的最短距离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <bits/stdc++.h>
using namespace std;
const int N=505;
int g[N][N];
bool vis[N];
int dist[N];
int n,m;
int dijkstra()
{
	memset(dist,0x3f,sizeof dist);
	dist[1]=0;
	for(int i=0;i<n;i++)
	{
		int t=-1;
		for(int j=1;j<=n;j++)
		{
			if(!vis[j]&&(t==-1||dist[j]<dist[t]))
				t=j;
		}
		vis[t]=true;
		for(int j=1;j<=n;j++)
			dist[j]=min(dist[j],dist[t]+g[t][j]);
	}
	if(dist[n]==0x3f3f3f3f)
		return -1;
	else
		return dist[n];
}
int main()
{
	cin>>n>>m;
	memset(g,0x3f,sizeof g);
	for(int i=0;i<m;i++)
	{
		int a,b,c;
		cin>>a>>b>>c;
		g[a][b]=min(g[a][b],c);
	}
	int t=dijkstra();
	cout<<t<<endl;
	return 0;
} 

### Dijkstra算法实现短路径计算 Dijkstra算法是一种经典的图论算法,用于解加权有向图中的单源短路径问题。该算法的核心思想是从起始节点出发,逐步扩展已知的短路径集合,直到找到目标节点或遍历整个图为止。 #### 算法的基本原理 Dijkstra算法通过维护一个距离数组 `dist[]` 来记录从起点到各个顶点的当前短路径长度,并利用优先队列来动态更新这些距离值。每次从未访问过的节点中选取具有小距离值的节点作为新的中间节点,以此为基础进一步探索其相邻节点的距离[^2]。 以下是使用Python语言实现的一个简单版本: ```python import heapq def dijkstra(graph, start): n = len(graph) dist = [float('inf')] * n # 初始化距离数组为无穷大 visited = [False] * n # 标记是否已经确定短路径 dist[start] = 0 # 起点到自身的距离为0 heap = [(0, start)] # 小根堆存储 (当前距离, 当前节点) while heap: current_dist, u = heapq.heappop(heap) # 取出未处理的近节点 if visited[u]: continue visited[u] = True for v, weight in graph[u]: # 遍历邻居节点 if not visited[v] and dist[u] + weight < dist[v]: dist[v] = dist[u] + weight # 更新更短的距离 heapq.heappush(heap, (dist[v], v)) # 加入待处理列表 return dist ``` 此代码片段展示了如何构建并运行Dijkstra算法。其中输入参数是一个邻接表形式表示的图 `graph` 和指定的起点索引 `start`。函数返回的是一个包含从起点到达每个节点所需短路径长度的一维数组 `dist[]`[^1]。 对于C++环境下的具体实现方式可以参考如下模板: ```cpp #include <vector> #include <queue> #include <climits> using namespace std; struct Node { int to; long cost; }; long dijkstra(int s, vector<vector<Node>> &G){ const int INF = INT_MAX / 2; // 定义极大值防止溢出 priority_queue<pair<long,int>, vector<pair<long,int>>, greater<>> pq; vector<long> d(G.size(),INF); d[s]=0; pq.emplace(0,s); while(!pq.empty()){ pair<long,int> p=pq.top();pq.pop(); int v=p.second; if(d[v]<p.first)continue; for(auto e : G[v]){ if(d[e.to]>d[v]+e.cost){ d[e.to]=d[v]+e.cost; pq.emplace(d[e.to],e.to); } } } return (*max_element(d.begin()+1,d.end())!=INF)?*max_element(d.begin()+1,d.end()):-1; } ``` 上述两段伪码分别提供了两种主流编程语言下执行迪杰斯特拉方法的具体流程说明及其逻辑框架[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值