hdu 1875 畅通工程再续
一开始看到给的坐标直接懵了,也没想出来怎么处理。
枚举所有符合条件的长度,个数在n^2之内
然后人工加上一个序号就好了~
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }