POJ 1258

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\n",ans);
44     }
45 }

 

posted @ 2016-04-17 22:27  一个_小菜鸟  阅读(212)  评论(0编辑  收藏  举报