迪杰斯特拉(朴素)

#include<bits/stdc++.h>
using namespace std;
int n,m;
const int INF=INT_MAX;
const int N=510;
int g[N][N],dist[N];
bool st[N];
int dijkstra()
{
	 for (int i = 0; i < N; i++)  
            dist[i] = INF;
	dist[1]=0;
	for(int i=0;i<n;i++)
	{
		int t=-1;
		for(int j=1;j<=n;j++)
		{
			if(!st[j]&&(t==-1||dist[t]>dist[j]))
			{
				t=j;
			}
		}
		if(t==-1)
		{
			break;
		}
		st[t]=true;
		for(int j=1;j<=n;j++)
		{
			if(g[t][j]<INF)
			{
				dist[j]=min(dist[j],dist[t]+g[t][j]);
			}
		}
	}
	if(dist[n]==INF)
	{
		return -1;
	}
	else
	{
		return dist[n];
	}
	
}
int main ()
{
	scanf("%d%d",&n,&m);
	 for (int i = 0; i < N; i++)   
        for (int j = 0; j < N; j++)
            g[i][j] = INF;
	while(m--)
	{
		int x,y,c;
		scanf("%d%d%d",&x,&y,&c);
		g[x][y]=min(g[x][y],c);
	}
	int jb=dijkstra();
	cout<<jb<<endl;
	return 0;
}
//by crtzk7

### 朴素迪杰斯特拉算法的实现与原理 #### 原理概述 Dijkstra 算法是一种用于计算加权图中单源最短路径的经典贪心算法。它通过维护一个距离数组 `dist` 和一个标记数组 `visited` 来逐步扩展已知的最短路径集合。对于有向图,该算法同样适用,只需按照边的方向进行遍历即可。 在朴素版 Dijkstra 算法中,核心思想是从起点出发,依次选取当前未访问结点中具有最小临时距离的结点,并利用其更新相邻结点的距离值。此过程重复执行直到所有可到达的结点都被处理完毕[^1]。 #### 数据结构说明 - **邻接矩阵表示图**:假设图中有 n 个顶点,则可以使用大小为 n×n 的二维数组来存储每一对顶点间的权重关系。如果两顶点之间不存在直接连接,则对应位置设为无穷大(通常用极大整数值代替),而自环则初始化为零。 - **辅助数据结构** - `dist[]`: 记录从起始节点到各目标节点的最佳估计成本; - `visited[]`: 跟踪哪些节点已经被最终确认拥有最优解; #### 步骤描述转换成伪代码形式如下: ```python def dijkstra(graph, start_node): import math num_nodes = len(graph) INF = math.inf dist = [INF]*num_nodes # 初始化所有的距离都为正无穷 visited = [False]*num_nodes # 所有的节点都没有被访问过 dist[start_node] = 0 # 初始节点到自身的距离设置为0 for _ in range(num_nodes): min_distance = INF # 寻找尚未确定的最近节点 u = -1 # 遍历寻找下一个要固定的节点u for v in range(num_nodes): if not visited[v] and dist[v]<min_distance: min_distance=dist[v] u=v if min_distance==INF: break; # 如果找不到更近的点了就提前结束循环 visited[u]=True # 将找到的那个节点加入已经完成队列里去 # 更新邻居们的距离 for neighbor in range(num_nodes): weight = graph[u][neighbor] if weight != INF and (not visited[neighbor]): new_dist = dist[u]+weight if new_dist<dist[neighbor]: dist[neighbor]=new_dist return dist # 返回结果列表 ``` 上述函数接受参数包括整个图以及指定的一个起始节点编号。其中graph是一个二维数组代表完整的带权有向图,start_node则是我们希望求得离哪个定点最近的所有其他点的信息[^2]。 #### 复杂度分析 由于每次都需要扫描全部剩余节点来找寻下一次应该固定下来的候选者,因此时间复杂度达到了O(),这里V指的是总的顶点数。当面对稀疏图时效率较低,此时更适合采用基于二叉堆或者斐波那契堆优化后的版本降低整体耗时至接近线性的水平。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值