http://poj.org/problem?id=1258
今天晚上随便找了两道题,没想到两道都是我第一次碰到的类型———最小生成树。我以前并没有见过,也不知道怎么做,然后就看书,思路很容易理解
但我最开始确想错了,我想成每一个点只可以连接一个或者两个地方,所以那样写出来的答案根本就是错误的,也不是这个树所表达的意思
最后多次对书上的算法接合案例一步一步的进行推倒,才发现我的想法是错了,用了一个多小时
1 #include <stdio.h> 2 #include <string.h> 3 4 5 #define inf 100009 6 7 bool mark[1001]; 8 int a[1001][1001],dis[1001],ans,n; 9 10 int prim() 11 { 12 for(int i=1;i<=n;i++) 13 dis[i]=inf;dis[1]=0; 14 for(int i=1;i<=n;i++){ //其内涵就是用dis数组来记录下每一列的最小的长度,然后加起来也便是最小的长度 15 int tep=inf;int k=0; 16 for(int j=1;j<=n;j++){ 17 if(mark[j]&&dis[j]<tep) //有n个相连的话,最短需要连接n-1次,也可以看出是连接n次,那就是还有一个是自己连接自己,长度为0。 18 { 19 tep=dis[j]; 20 k=j; 21 } 22 } 23 if(tep==inf) return 0; 24 ans+=tep; 25 mark[k]=false; 26 for(int j=1;j<=n;j++) 27 if(mark[j]&&dis[j]>a[k][j]) 28 dis[j]=a[k][j]; 29 } 30 return 0; 31 } 32 33 int main() 34 { 35 while(scanf("%d",&n)!=EOF) 36 { 37 memset(mark,true,sizeof(mark)); 38 ans=0; 39 for(int i=1;i<=n;i++) 40 for(int j=1;j<=n;j++) 41 scanf("%d",&a[i][j]); 42 prim(); 43 printf("%d ",ans); 44 } 45 }