您的位置:首页 > 其它

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

2016-07-20 14:52 204 查看
直接上代码:
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];
}
}
}

从上两图中可以知道,不同点及解释就在我做标记的地方。
迪杰斯特拉:

求的是一点到另一点的最短距离。属于单源点问题。
普雷姆:
求最小生成树,求的是一堆的点,就是任意两点的距离的总和。

因此最小生成树中从一点到另一点的距离不一定是最短的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: