POJ 最小生成树专辑

最下生成树题目汇集:

POJ 2845 Highways     http://poj.org/problem?id=2485

最小生成树(并查集解)胚胎级题目:还行没忘完,还算顺利:

注意结构体的s开的范围要大于N*N/2;(Runtime error)

用algorithm 的头文件时,不要用max作变量名称;(CE)

POJ 最小生成树专辑 View Code
 1 #include<iostream>

 2 #include<algorithm>

 3 #include<cstring>

 4 #include<cstdio>

 5 using namespace std;

 6 #define N 505

 7 int map[N][N];

 8 int f[N];

 9 int t,n;

10 int Max;

11 struct node{

12   int    num1,num2,len;

13 }s[255555];

14 bool cmp(node a,node b)

15 {

16     return a.len<b.len;

17 }

18 void sequence(int x)

19 {

20     for(int i=1;i<=n;i++)

21         f[i]=i;

22 }

23 int find(int x)

24 {

25     if(x!=f[x])

26        f[x]=find(f[x]);

27     return f[x];

28 }

29 void Union(int x,int y,int index)

30 {

31     x=find(x);

32     y=find(y);

33     if(x!=y)

34     {

35         f[x]=y;

36         if(index>Max)

37             Max=index;

38     }

39 }

40 int main()

41 {

42     int i,j;

43     scanf("%d",&t);

44     while(t--)

45     {

46     

47         memset(map,0,sizeof(map));

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

49         sequence(n);

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

51             for(j=1;j<=n;j++)

52             {

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

54             }

55         int k=0;

56         for(i=1;i<=n;i++)

57             for(j=i+1;j<=n;j++)

58             {

59                 s[k].num1=i;

60                 s[k].num2=j;

61                 s[k].len=map[i][j];

62                 k++;

63             }

64             sort(s,s+k,cmp);

65         //    for(i=0;i<k;i++)

66         //    {

67         //        cout<<s[i].num1<<" "<<s[i].num2<<" "<<s[i].len<<endl;

68         //    }

69             Max=0;

70             for(i=0;i<k;i++)

71             {

72                 Union(s[i].num1,s[i].num2,s[i].len);

73             }

74             printf("%d\n",Max);

75     }

76     return 0;

77 }

 

 

 更新中。。。

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