最小生成树问题,印象中有一种算法跟狄杰斯卡尔算法差不多就把它稍微改了下交了,然后过了,有时间好好研究最小生成树算法。

下面贴出代码,以作纪念。

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 }

 

posted on 2012-08-07 09:51  醉春雨  阅读(232)  评论(0)    收藏  举报