1. 程式人生 > >dijsktra演算法和prim演算法的區別

dijsktra演算法和prim演算法的區別

/*
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]); } }