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 }