两个算法代码思想极其相似,在这里总结下!防止以后乱套。。
prim算法是解决最小生成树问题,也就是权值最小问题。
而 dijkstra算法解决的是最短路径问题。二者相似的点在于都是解决图的边的算法。
并且最关键的特点是都是从一点(起点)开始,进行向外其他未遍历过点的拓展。
区别:
dis数组存放的东西不同
prim算法:dis数组更新的是———–从下步可以拿到的点与之前标记过的某一点的最短距离。
dijkstra则是从:dis数组更新的是—–从下一步可以拿到的点到开始点的距离与dis数组中存放的到源点的距离比较更新。
代码差别在红色部分
Prim算法
void prim(int cur)
{
int sum=0;
for(int i=2;i<=n;i++)
{
dis[i]=mp[cur][i];
}
int index=cur;
int minn=INF;
for(int k=1;k<=n;k++)
{
minn=INF;
for(int i=1;i<=n;i++)//注意这里是1~N N次找点循环,注意确定的是点,而非边。
{
if(vis[i]==0&&dis[i]<minn)
{
index=i;
minn=dis[i];
}
}
sum+=minn;
vis[index]=1;
for(int j=1;j<=n;j++)
{
if(!vis[j])
dis[j]=min(dis[j],mp[index][j]);
}
}
cout<<sum<<endl;
}
dijkstra算法
void dijkstra(int cur)
{
for(int i=0;i<n;i++)
{
dis[i]=mp[cur][i];
}
dis[cur]=0;
int minn;
int index=cur;
for(int i=0;i<n;i++)
{
minn=INF;
for(int j=0;j<n;j++)
{
if(!vis[j]&&dis[j]<minn)
{
index=j;
minn=dis[j];
}
}
vis[index]=1;
for(int j=0;j<n;j++)
{
if(!vis[j]&&dis[j]>mp[index][j]+dis[index])
{
dis[j]=mp[index][j]+dis[index];
}
}
}
cout<<dis[ed]<<endl;
}