dijsktra演算法和prim演算法的區別
阿新 • • 發佈:2018-12-17
/*
dij中的dist[i]表示的是到起始點s的距離;而prim中的dist[i]表示的是到這棵樹的距離.
就比如我們在寫跟新dist[i]陣列時dij中的寫法是這樣的dist[j]=dist[pos]+a[pos][j]
而在prim中的做法是這樣的dist[j]=a[pos][j]
具體的話可以自己感悟感悟(除錯一下即可)
*/
void dij(int s) {
memset(vis,0,sizeof(vis));sum=0;
memset(dist,0x3f,sizeof(dist));
for(register int i=1;i<=n;++i) dist[i] =a[s][i];
vis[s]=1;
for(register int i=1;i<=n-1;++i) {
int minn=0x3f3f3f3f;
for(register int j=1;j<=n;++j)
if(!vis[j]&&dist[j]<minn) minn=dist[j],pos=j;
vis[pos]=1;
sum=sum+dist[pos]*vv;//這裡不用管
for(register int j=1;j<=n;++ j)
if(!vis[j]&&dist[j]>a[pos][j]+dist[pos])
dist[j]=min(dist[j],dist[pos]+a[pos][j]);
}
}
void prim(int s) {
memset(vis,0,sizeof(vis));sum=0;
memset(dist,0x3f,sizeof(dist));
for(register int i=1;i<=n;++i) dist[i]=a[s][i];
vis[s]=1;
for(register int i=1;i<=n-1;++i) {
int minn=0x3f3f3f3f;
for(register int j=1;j<=n;++j)
if(!vis[j]&&dist[j]<minn) minn=dist[j],pos=j;
vis[pos]=1;
sum=sum+dist[pos]*vv;//這裡不用管
for(register int j=1;j<=n;++j)
if(!vis[j]&&dist[j]>a[pos][j])
dist[j]=min(dist[j],a[pos][j]);
}
}