POJ 1258 Agri-Net 最小生成树

 http://poj.org/problem?id=1258

 

求最小生成树权值问题,理解输入要求,很简单

和 POJ 2485输入要求一样 

4

0 4 9 21

4 0 8 17

9 8 0 16

21 17 16 0

4表示4行4列 (i=j=4)

矩阵中的数字表示第i个点与第j个点的权值  如第一行中的9  表示第1(第1行)个点与第3(第3列)个点的权值为9

 

代码简单

 

 1 #include<stdio.h>

 2 #include<stdlib.h>

 3 int bin[100001];

 4 int map[600][600];

 5 struct node

 6 {

 7     int u,v,w;

 8 }edg[100000];

 9 

10 int cmp(const void *a,const void *b)

11 {

12     struct node *c=(struct node *)a;

13     struct node *d=(struct node *)b;

14     return c->w-d->w;

15 }

16 

17 int find(int x)

18 {

19     int r=x;

20     while(r!=bin[r])

21     r=bin[r];

22     return r;

23 }

24 

25 int merge(int x,int y)

26 {

27     int fx=find(x);

28     int fy=find(y);

29     if(fx!=fy)

30     {

31         bin[fx]=fy;

32         return 1;

33     }

34     else

35     return 0;

36 }

37 

38 int main()

39 {

40         int m,i,j,h,count,num;

41         int mx;

42         while(scanf("%d",&m)!=EOF)

43         {

44         for(i=1;i<=m;i++)

45         for(j=1;j<=m;j++)

46         scanf("%d",&map[i][j]);

47         num=0;

48         for(i=1;i<=m;i++)

49         {

50             for(j=1;j<=m;j++)

51             {

52                 edg[num].u=i;

53                 edg[num].v=j;

54                 edg[num].w=map[i][j];

55                 num++;

56             }

57         }

58 

59        for(i=0;i<=m;i++)

60        bin[i]=i;

61         qsort(edg,m*m,sizeof(struct node ),cmp);

62         count=0;mx=0;

63         for(i=0;i<num;i++)

64         {

65             if(merge(edg[i].u,edg[i].v))

66             {count+=edg[i].w;}

67         }

68         printf("%d\n",count);

69         }

70 

71     return 0;

72 }
View Code

 

 

你可能感兴趣的:(最小生成树)