模板2:
#include <iostream>#include<bits/stdc++.h>using namespace std;#define inf 99999999#define maxn 2002//Prim算法模板int e[maxn][maxn],book[maxn],dis[maxn],n,m,t1,t2,t3;int main(){ while(~scanf("%d%d",&n,&m)) { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i==j) e[i][j]=0; else e[i][j]= inf; } } for(int i=1;i<=m;i++) { scanf("%d%d%d",&t1,&t2,&t3); e[t1][t2] = t3; e[t2][t1] = t3; } for(int i=1;i<=n;i++) { book[i] = 0; dis[i] = e[1][i]; } int count = 0,sum = 0,min,j; book[1] = 1;//標記該點是否已經在生成樹中 count++; while(count<n) { min = inf; for(int i=1;i<=n;i++) { if(book[i]==0&&dis[i]<min) { min = dis[i]; j = i; } }//從數組dis中找到離生成樹最近的頂點,并加入生成樹中 book[j] = 1; count++; sum+=dis[j];//數組dis表示生成樹到各個頂點的距離 for(int k=1;k<=n;k++)//以J為中間點,更新生成樹到每一個頂點的距離 { if(book[k]==0&&dis[k]>e[j][k]) dis[k] = e[j][k];//此處的松弛操作更改的是中間點到每個點(假如從該點到其他頂點更小的話則更新) } } //由于該算法是層層遞推覆蓋所以會取得最佳效果 printf("%d/n",sum); } return 0;}新聞熱點
疑難解答