题目网址:http://poj.org/problem?id=1258
题目:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 60004 | Accepted: 24855 |
Description
Input
Output
Sample Input
4 0 4 9 21 4 0 8 17 9 8 0 16 21 17 16 0
Sample Output
28
最小生成树水题~因为点数比较少,而且题目给的是邻接矩阵 所以用了Prim算法。
代码:
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 const int inf=11111111; 6 int n,res; 7 int dist[105],f[105][105]; 8 int vis[105]; 9 void prim(){ 10 int v=0; 11 memset(vis, 0, sizeof(vis)); 12 for (int i=1; i<=n; i++) dist[i]=inf; 13 dist[1]=0; 14 for (int i=1; i<=n; i++) { 15 int Min=inf; 16 for (int j=1; j<=n; j++) { 17 if(dist[j]<Min && !vis[j]){ 18 Min=dist[j]; 19 v=j; 20 } 21 } 22 vis[v]=1; 23 res+=dist[v]; 24 for (int j=1; j<=n; j++) { 25 dist[j]=min(dist[j],f[v][j]);//算法核心,是求遍历点到部分最小生成树的最小距离,而不是单个点 26 } 27 } 28 } 29 int main(){ 30 while (scanf("%d",&n)!=EOF && n) { 31 res=0; 32 for (int i=1; i<=n; i++) { 33 for (int j=1; j<=n; j++) { 34 scanf("%d",&f[i][j]); 35 } 36 } 37 prim(); 38 printf("%d\n",res); 39 } 40 return 0; 41 }
原文:http://www.cnblogs.com/uniles/p/7265990.html