hdu1233还是畅通工程(prim)

来源:互联网 发布:淘宝怎么用支付宝付款 编辑:程序博客网 时间:2024/05/24 15:39

http://acm.hdu.edu.cn/showproblem.php?pid=1233

#include<iostream>#include<cstdio>using namespace std;int mat[110][110],dist[110],n;bool visited[110];// 寻找V-U中未被访问,且dist最小的顶点int MinVertex( ) {int k = -1;int minValue=INT_MAX;for (int i = 0;  i<n; i++) {if (dist[i] < minValue && visited[i]==false){minValue=dist[i];k = i;}}return k;}//辅助数组保存了最小生成树的完整信息,其中dist之和就是MST的代价, adjvex则给出了MST的构造情况。void Prim(int u) { //从顶点u出发构造网的最小生成树// 辅助数组初始化int i;for(i=0; i<n; i++){ dist[i]=mat[u][i]; }fill(visited, visited+n, false); visited[u] = true;      // 初始,U={u}for(int v=1; v<n; v++){   // 选择vexnum-1个顶点(边)int k=MinVertex( );  // 加入生成树的下一个顶点(k)visited[k] = true;  // 新节点加入集合U// 调整集合V-U中剩余顶点到集合U的最短距离for (i=0; i<n; i++)  {if (visited[i]==false && mat[k][i]<dist[i]) {dist[i]= mat[k][i];}}}}int main(){int m,sum,a,b,c,i;while(scanf("%d",&n),n){m=n*(n-1)/2;fill(&mat[0][0],&mat[n][n],INT_MAX);for(i=0;i<m;i++){scanf("%d%d%d",&a,&b,&c);a--;b--;mat[a][b]=mat[b][a]=c;}Prim(0);sum=0;for(i=1;i<n;i++)sum+=dist[i];printf("%d\n",sum);}return 0;}


0 0