最小树(二)(最小生成树prim)
|
description |
在森林里住了n只小熊,他们分别叫小熊A,小熊B……,小熊们决定修建水泥路让他们能更加方便的往来,使得任何一只小熊都能轻松到达其他小熊的家,同时小熊们希望修建的水泥路最短。 |
input |
测试输入若干实例,每个测试实例第一行给出小熊的数目n和小熊们能直接通往的m条道路,(n,m < 100)接下来m行,每行为两只小熊的名字(分别为A,B,C.........,若n为3,则只会出现A,B,C,依次类推)以及这两只小熊之间的距离(为正整数)。 |
output |
输出最短的水泥路的长度,若不能满足任何一只小熊到其他所有小熊的家,则输出-1. |
sample_input |
3 3 A B 1 A C 2 B C 4 3 1 A B 2 |
sample_output |
AC 代码:
#include<iostream> #include<cstdio> #include<string.h> using namespace std; #define MAX 99999 #define LEN 101 int dist[LEN]; int map[LEN][LEN]; bool isvisited[LEN]; int m; void init()//这个函数是用来防止一点到另一点没路时 { int i,j; for(i=0; i<LEN; i++) { for(j=0; j<LEN; j++) { map[i][j]=MAX; } } } int prime(int n) { int i,j,min,pos,sum; sum=0; memset(isvisited,false,sizeof(isvisited)); for(i=1; i<=n; i++) { dist[i]=map[1][i]; } isvisited[1]=true; dist[1]=MAX; for(i=1; i<n; i++) { min=MAX; for(j=1; j<=n; j++) { if(!isvisited[j] && dist[j]<min) { min=dist[j]; pos=j; } } if(min==MAX)//最小的既然都达到这个程度了,就意味着这两点之间是不连着的 { return -1; } sum+=min; isvisited[pos]=true; for(j=1; j<=n; j++) { if(!isvisited[j] && dist[j]>map[pos][j]) { dist[j]=map[pos][j]; } } } return sum; } int main() { int n,m; while(~scanf("%d%d",&m,&n)) { init(); int i,a,b,w,ans; char c,d; if(n==0) break; for(i=0; i<n; i++) { cin>>c>>d>>w; a=c-'A'+1; b=d-'A'+1; if(map[a][b]>w) { map[a][b]=map[b][a]=w; } } ans=prime(m); cout<<ans<<endl; } return 0; }
|
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
暂时没有评论,来抢沙发吧~