模板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;}新闻热点
疑难解答