3.1.1 Agri-Net

发现前面有一堆类似dfs的题目,做多了有点烦,就直接跳到后面看看,发现这题最小生成树,刚好前几天看书看到,就拿来做做,但很不顺利的wa了,找了很久bug也不知道。终于在某次中发现了,原来我直接用x了,竟然能对6个case,可怕!改了后果断ac,经典prim算法,我就不说了,自己看书去。

View Code
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<math.h>
 4 #include<stdlib.h>
 5 #define max(a,b) a>b?a:b
 6 #define min(a,b) a>b?b:a
 7 #define INF     0x3f3f3f3f
 8 #define Maxin 10000
 9 int fang[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
10 int map[105][105],n;
11 int in[105],inn=0,notin[105];//in是已经被用过的点,notin是还没用的点
12 int get()
13 {
14    int x,ans=INF;
15    int ay;
16    for(x=0;x<inn;x++)//在已经用的点里找一个距离最小的边来用
17        {
18            int y;
19            for(y=0;y<n;y++)
20              if(notin[y]!=-1&&map[in[x]][y]<ans&&in[x]!=y)//notin!=-1表示还没被用
21              {
22                  ans=map[in[x]][y];
23                  ay=y;
24              }
25        }
26        in[inn++]=ay;
27        notin[ay]=-1;
28        return ans;
29 }
30 
31 int main()
32 {
33     int x,y,ans=0;
34     scanf("%d",&n);
35     for(x=0;x<n;x++)
36     {
37         for(y=0;y<n;y++)
38         scanf("%d",&map[x][y]);
39         notin[x]=x;
40     }
41     in[inn++]=0;
42     notin[0]=-1;
43     while(inn!=n)
44     ans+=get();
45     printf("%d\n",ans);
46     return 0;
47 }

posted on 2012-05-26 23:49  usp10  阅读(229)  评论(0编辑  收藏  举报

导航