POJ 2485 Highways 最小生成树

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

 

求最小生成树中权值最大的

这题样例有点奇葩,自己好几种错误理解都能配的上这个样例,囧。

样例中的那个3表示有3行3列   i行j列  i=j

每一个数字表示第i个点和第j个点的连接权值为map[i][j];

代码不难

 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 n,m,i,j,h,count,num;

41         int mx;

42         scanf("%d",&n);

43         for(h=1;h<=n;h++)

44         {

45         scanf("%d",&m);

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

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

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

49         num=0;

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

51         {

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

53             {

54                 edg[num].u=i;

55                 edg[num].v=j;

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

57                 num++;

58             }

59         }

60 

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

62        bin[i]=i;

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

64         count=0;mx=0;

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

66         {

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

68             {count+=edg[i].w;

69             if(edg[i].w>mx)

70             mx=edg[i].w;}

71         }

72         printf("%d\n",mx);

73         }

74 

75     return 0;

76 }
View Code

 

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