题目1017:还是畅通工程(最小生成树)
问题来源
http://ac.jobdu.com/problem.php?pid=1017
问题描述
给你n个村庄,给出各个村庄之间的距离,求最小生成树。
问题分析
纯粹的求最小生成树问题。请参考:最小生成树(Prim算法+Kruskal算法)
参考代码
// // Created by AlvinZH on 2017/5/3. // Copyright (c) AlvinZH. All rights reserved. // #include<iostream> #include<string> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int INF=0x3f3f3f3f; const int N=101; int G[N][N];//邻接矩阵 int Lowest[N];//权值数组,表示和已选顶点的最小权值,Lowest[i]=0表示点i已经在Vnew中 int n,m; int prim() { int Num=0;//最小生成树权值 for(int i=2;i<=n;i++)//选取第一个点开始 Lowest[i]=G[1][i];//取第一行权值 for(int i=1;i<n;i++)//找到新顶点加入(n-1个) { int minid=0; int mindis=INF; for(int j=2;j<=n;j++)//找到距离最小的 { if(Lowest[j]!=0&&Lowest[j]<mindis) { mindis=Lowest[j]; minid=j; } } Num+=mindis; Lowest[minid]=0;//把点minid加入Vnew for(int j=2;j<=n;j++)//更新Lowest数组 if(Lowest[j]>G[minid][j]) Lowest[j]=G[minid][j]; } return Num; } int main() { while(~scanf("%d",&n)&&n!=0) { memset(G,0x3f,sizeof(G));//初始化为最大值 for(int i=1;i<=n;i++)//对角线为0 G[i][i]=0; m=(n*(n-1))/2; int u,v,w; for(int i=1;i<=m;i++) { scanf("%d%d%d",&u,&v,&w); G[u][v]=G[v][u]=w; } int MST=prim();//计算最小生成树总权值 printf("%d\n",MST); } }
作者: AlvinZH
出处: http://www.cnblogs.com/AlvinZH/
本人Github:https://github.com/Pacsiy/JobDu
本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。