最小生成树问题,印象中有一种算法跟狄杰斯卡尔算法差不多就把它稍微改了下交了,然后过了,有时间好好研究最小生成树算法。
下面贴出代码,以作纪念。
View Code
1 /*{ 2 ID:jzy3209981 3 PROG:agrinet 4 LANG:C++ 5 }*/ 6 #include<stdio.h> 7 #include<iostream> 8 #include<string.h> 9 #include<math.h> 10 using namespace std; 11 12 int grid[100][100]; 13 int distances[10000][2]; 14 int visit[100]; 15 int visitt[100][100]; 16 int result; 17 void dstr(int n) 18 { 19 int po=0,j=0,i,shortpoint,p,minn,nowpoint,changep; 20 visit[0]=1; 21 nowpoint=0; 22 int change[2]; 23 while(po<=j) 24 { 25 minn=100000; 26 for(i=0;i<n;i++) 27 if(grid[nowpoint][i]!=0&&visitt[nowpoint][i]!=1) 28 { 29 distances[j][0]=grid[nowpoint][i]; 30 distances[j][1]=i; 31 visitt[nowpoint][i]=1; 32 j++; 33 } 34 for(p=po;p<j;p++) 35 if(distances[p][0]<minn&&visit[distances[p][1]]!=1) 36 { 37 minn=distances[p][0]; 38 shortpoint=distances[p][1]; 39 changep=p; 40 } 41 nowpoint=shortpoint; 42 if(visit[distances[changep][1]]!=1) 43 result+=distances[changep][0]; 44 change[0]=distances[changep][0]; 45 change[1]=distances[changep][1]; 46 distances[changep][0]=distances[po][0]; 47 distances[changep][1]=distances[po][1]; 48 distances[po][0]=change[0]; 49 distances[po][1]=change[1]; 50 po++; 51 visit[nowpoint]=1; 52 } 53 } 54 int main() 55 { 56 freopen ("agrinet.in","r",stdin); 57 freopen ("agrinet.out","w",stdout); 58 int n,i,j,p=0; 59 scanf("%d",&n); 60 for(i=0;i<n;i++) 61 for(j=0;j<n;j++) 62 scanf("%d",&grid[i][j]); 63 dstr(n); 64 printf("%d\n",result); 65 return 0; 66 }

浙公网安备 33010602011771号