我眼中 迪杰斯特拉(Dijkstra)与 普雷姆 (prim)的 区别

直接上代码:
void dijistra()
{
	memset(vis,0,sizeof(vis));
	for(int i=0;i<n;++i)
	dist[i]=map[0][i];
	vis[0]=1;
	
	int u=0;
	for(int i=0;i<n-1;++i)
	{
		int mins=1e8;
		for(int j=0;j<n;++j)
		{
			if(dist[j]<mins&&!vis[j])
			{
				mins=dist[j];
				u=j;
			}
		}
		
		if(vis[u])
		continue;
		vis[u]=1;
		for(int j=0;j<n;++j)
		{
			if(dist[j]>map[u][j]+dist[u])   //从出发点(先到u的距离最短距离)到j的距离可以缩短; 
			dist[j]=map[u][j]+dist[u];
		} 
	}
}
void prim()
{
	memset(vis,0,sizeof(vis));
	for(int i=0;i<n;++i)
	dist[i]=map[0][i];
	vis[0]=1;
	
	int u=0;
	for(int i=0;i<n-1;++i)
	{
		int mins=1e8;
		for(int j=0;j<n;++j)
		{
			if(dist[j]<mins&&!vis[j])
			{
				mins=dist[j];
				u=j;
			}
		}
		
		if(vis[u])
		return;
		vis[u]=1;
		for(int j=0;j<n;++j)
		{
			if(dist[j]>map[u][j])   //从u点到j的距离可以缩短; 
			dist[j]=map[u][j];
		} 
	}
}
从上两图中可以知道,不同点及解释就在我做标记的地方。
迪杰斯特拉:
求的是一点到另一点的最短距离。属于单源点问题。
普雷姆:
求最小生成树,求的是一堆的点,就是任意两点的距离的总和。

因此最小生成树中从一点到另一点的距离不一定是最短的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值