prim算法 最小生成树

来源:互联网 发布:mac gcc 升级最新版本 编辑:程序博客网 时间:2024/05/24 04:08

图结构练习——最小生成树

题目描述

 有n个城市,其中有些城市之间可以修建公路,修建不同的公路费用是不同的。现在我们想知道,最少花多少钱修公路可以将所有的城市连在一起,使在任意一城市出发,可以到达其他任意的城市。
 

输入

 输入包含多组数据,格式如下。
第一行包括两个整数n m,代表城市个数和可以修建的公路个数。(n<=100)
剩下m行每行3个正整数a b c,代表城市a 和城市b之间可以修建一条公路,代价为c。
 

输出

 每组输出占一行,仅输出最小花费。

示例输入

3 21 2 11 3 11 0

示例输出

20

提示

 

来源

 赵利强

示例程序

[html] view plaincopy
  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #include <stdlib.h>  
  4. #define inf 999999  
  5. int map[110][110];  
  6. int vis[110];  
  7. int dis[110];  
  8. int sum;  
  9. void prim(int n)  
  10. {  
  11.     int i,j,k;  
  12.     int min;  
  13.     sum=0;  
  14.     memset(vis,0,sizeof(vis));  
  15.     for(i=1; i<=n; i++)  
  16.         dis[i]=map[1][i];  
  17.     vis[1]=1;  
  18.     for(i=2; i<=n; i++)  
  19.     {  
  20.         min=inf;  
  21.         for(j=1; j<=n; j++)  
  22.         {  
  23.             if(min>dis[j]&&!vis[j])  
  24.             {  
  25.                 k=j;  
  26.                 min=dis[j];  
  27.             }  
  28.         }  
  29.         vis[k]=1;  
  30.         sum+=min;  
  31.         for(j=1; j<=n; j++)  
  32.         {  
  33.             if(map[k][j]<dis[j]&&!vis[j])  
  34.                 dis[j]=map[k][j];  
  35.         }  
  36.     }  
  37.     printf("%d\n",sum);  
  38. }  
  39. int main()  
  40. {  
  41.     int n,m,i,j;  
  42.     int u,v,w;  
  43.     while(~scanf("%d %d",&n,&m))  
  44.     {  
  45.         if(m<n-1)  
  46.         {  
  47.             printf("0\n");  
  48.         }  
  49.         else  
  50.         {  
  51.             for(i=1; i<=n; i++)  
  52.                 for(j=1; j<=n; j++)  
  53.                 {  
  54.                     if(i==j)  
  55.                         map[i][j]=0;  
  56.                     else  
  57.                         map[i][j]=inf;  
  58.                 }  
  59.             while(m--)  
  60.             {  
  61.                 scanf("%d %d %d",&u,&v,&w);  
  62.                 if(w<map[u][v])//这一步的意思是为了防止类似2,3,4和2,3,3这种情况的出现  
  63.                     map[u][v]=map[v][u]=w;  
  64.             }  
  65.             prim(n);  
  66.         }  
  67.     }  
  68.     return 0;  

0 0
原创粉丝点击