hdu 1875 畅通工程再续

一开始看到给的坐标直接懵了,也没想出来怎么处理。

枚举所有符合条件的长度,个数在n^2之内

然后人工加上一个序号就好了~

 1 #include "iostream"

 2 #include "algorithm"

 3 #include "cstdio"

 4 #include "cmath"

 5 using namespace std;

 6 #define MAXN 111

 7 

 8 struct loc{

 9     double a,b;

10 }q[MAXN];

11 

12 struct node{

13     int x,y;

14     double l;

15     int n;

16 }p[MAXN*MAXN];

17 

18 int fa[MAXN*MAXN];

19 int n, num;

20 double ans;

21 bool ok;

22 bool cmp(node x,node y)

23 {

24     return x.l < y.l; 

25 }

26 

27 void init()

28 {

29     num = 0;

30     ans = 0;

31     for (int i = 0;i < MAXN*MAXN; ++ i)

32         fa[i] = i,p[i].n = 1;

33 }

34 

35 int find(int x) 

36 {

37     return fa[x] = fa[x] == x ? x:find(fa[x]);

38 }

39 

40 void process()

41 {

42     init();

43     cin >> n;

44     for (int i = 0;i < n ; ++ i) 

45         cin >> q[i].a >> q[i].b;

46     for (int i = 0;i < n; ++ i)

47         for (int j = i+1;j < n; ++ j) {

48         p[num].x = i;

49         p[num].y = j;

50         double len =  sqrt((q[i].a - q[j].a)*(q[i].a - q[j].a) + (q[i].b - q[j].b)*(q[i].b- q[j].b));

51         if (len >= 10 && len <= 1000) {

52             p[num].l = len;

53             num++;

54             }

55         }

56         sort(p,p+num,cmp);

57         for (int i = 0; i < num ; ++ i) {

58             int x = find(p[i].x);

59             int y = find(p[i].y);

60             if (x != y) {

61                 fa[y] = x;

62                 ans += p[i].l*100;

63                 p[x].n += p[y].n;

64             }

65         }

66         int max = -1;

67         for (int i = 0;i < num; ++ i)

68             if (p[i].n > max) max = p[i].n;

69         if (max == n) printf("%.1lf\n",ans);

70         else cout << "oh!" << endl;

71 }

72 

73 int main()

74 {

75     int T;

76     cin >> T;

77     while (T--) {

78         process();

79     }

80     return 0;

81 }
代码君

 

你可能感兴趣的:(HDU)