acwing算法基础 最短路算法

//朴素Dijkstra 邻接矩阵存储稠密图  
int g[N][N];//g[a][b]:a->b的权重 
int dist[N];//dist[i]:起点到i的距离 
bool st[N];//st[i]:i点是否已确定最短路 
 
void dijkstra(int u)//u为起点 
{
	memset(dist,0x3f,sizeof dist);//距离都初始化为很大的数 
	dist[u]=0;//u->u 距离为0 起点为0 
	
	for(int i=0;i<n;i++)//n个点 n次循环 
	{
		int t=-1;//t是距离最近的未确定最短路点的编号 
		for(int j=1;j<=n;j++)//遍历n个点 
			if(!st[j] && (t==-1 || dist[t]>dist[j]))//寻找最近的点 //将图视除起点外都是迷雾,这里是确定开迷雾的方向
				t=j;
		
		st[j]=true;//找到的点 确定了最短路 
		
		for(int j=1;j<=n;j++)//遍历n个点 用最新的点更新迭代所有出边  
			dist[j]=min(dist[j],dist[t]+g[t][j]);//以原有的基础上进行开迷雾
 
	}
}

朴素dijkstra算法的大体思路,首先就行初始化,进行n-1次迭代,找到集合外距离起点最近的点,让这个点进入集合,然后用这个点去更新其他的点。

bellman-ford算法

为什么最后面会是dist[N]>0x3f3f3f3f/2;而不是dist[N]!=0x3f3f3f3f因为bellman-ford算法进行两重循环,存在dist点没有被更新而边被更新了的情况。

spfa算法bellman-ford算法的优化,对与bellman-ford算法中的未更新dist点却更新边导致的无效操作,进行判断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值