比較Dijkstra演算法和最小生成樹prim演算法之間的區別
阿新 • • 發佈:2019-02-20
我們先看看他們的模板:
Dijkstra演算法:
最小生成樹模板#include<iostream> #include<string.h> using namespace std; const int MAX=99999999; int n,m; int map[203][203],low[203],visit[203]; void dijkstrs(int start) { memset(visit,0,sizeof(visit)); int i,j,pos; visit[start]=1; for(i=1;i<=n;i++) { low[i]=map[start][i]; } low[start]=0; for(i=1;i<n;i++) { int min=MAX; pos=start;//這個地方不一樣 for(j=1;j<=n;j++) { if(visit[j]==0&&min>low[j]) { min=low[j]; pos=j; } } visit[pos]=1; for(j=1;j<=n;j++) { if(visit[j]==0&&map[pos][j]<MAX) { int ne=low[pos]+map[pos][j]; if(ne<low[j]) low[j]=ne; } } } } int main() { while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0) break; int i,j; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) map[i][j]=MAX; } int a,b,c; for(i=1;i<=m;i++) { cin>>a>>b>>c; if(map[a][b]>c) { map[a][b]=c; map[b][a]=c; } } dijkstrs(1); cout<<low[n]<<endl; } }
,我們仔細觀察上面的兩個模板,你會發現這兩個的程式碼差不多都一樣,主要在一個細節上不一樣:#include<iostream> #include<string.h> #include<stdio.h> using namespace std; #define MaxInt 0x3f3f3f3f; int n; int map[101][101],low[101],visit[101]; int prim() { int i,j,pos,result=0; memset(visit,0,sizeof(visit)); visit[1]=1; pos=1; for(i=1;i<=n;i++) { if(i!=pos) { low[i]=map[pos][i]; } } for(i=1;i<n;i++) { int min= MaxInt; for(j=1;j<=n;j++) { if(visit[j]==0&&min>low[j]) { min=low[j]; pos=j; } } result+=min; visit[pos]=1; for(j=1;j<=n;j++) { if(visit[j]==0&&low[j]>map[pos][j]) low[j]=map[pos][j]; } } return result; } int main() { while(scanf("%d",&n)!=EOF) { if(n==0) break; int m=n*(n-1)/2,i,j,a,b,c; for(i=1;i<=n;i++) { for(j=1;j<=n;j++) map[i][j]=MaxInt; } for(i=1;i<=m;i++) { scanf("%d%d%d",&a,&b,&c); map[a][b]=c; map[b][a]=c; } int ans=prim(); printf("%d\n",ans); } }
這個細節我已經標出來了;
這個我要引用別人的一個圖:
仔細看看他,就明白了這個區別了;
圖片引用於:http://www.wutianqi.com/?p=1890