直接上代码:
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];
}
}
}
从上两图中可以知道,不同点及解释就在我做标记的地方。
迪杰斯特拉:
求的是一点到另一点的最短距离。属于单源点问题。
求的是一点到另一点的最短距离。属于单源点问题。
普雷姆:
求最小生成树,求的是一堆的点,就是任意两点的距离的总和。
因此最小生成树中从一点到另一点的距离不一定是最短的。