最小生成樹——Prim演算法
阿新 • • 發佈:2019-01-01
#define INF 0x3f3f3f3f int Map[110][110];//記錄節點間關係,可達記為1,否則記為0; bool vis[110];//記錄節點是否被遍歷; int dis[110]; void Prim() { memset(vis,false,sizeof(vis)); int i,j; int sum=0;//記錄最小花費 //將1節點與其餘節點的可達關係存入到dis陣列; for(i=1; i<=n; i++) dis[i]=Map[1][i]; vis[1]=true; for(i=1; i<n; i++) { int m=INF;//記錄i節點與其餘節點的最短可達代價 int pos; //尋求與i節點有關的代價最小的節點 //若節點存在,pos記錄該節點的位置,m記錄可達代價 for(j=1;j<=n;j++) { if(!vis[j]&&dis[j]<m) pos=j,m=dis[j]; } if(m==INF) break;//查詢結束 vis[pos]=true; sum+=m;//計算到當前為止所花費的代價 for(j=1;j<=n;j++)//更新dis; if(!vis[j]&&dis[j]>Map[pos][j]) dis[j]=Map[pos][j]; } printf("%d\n",sum); }