HDU1875

Posted whiteli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU1875相关的知识,希望对你有一定的参考价值。

研究生复试题这么水的吗。。

根据合法距离得到所有合法边,跑一遍Kruscal以后判断所有点是不是有相同的祖先即可。

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<math.h>
 4 #include<string.h>
 5 using namespace std;
 6 int n,m,q,f[101],flag;
 7 double ans=0;
 8 struct node{
 9     double x,y;
10 }a[101];
11 
12 struct edge{
13     int from,to;
14     double w;
15     bool operator < (const edge &a){
16         return w<a.w;
17     }
18 }e[10010];
19 
20 double dis(node a,node b){
21     return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
22 }
23 
24 void ini(){
25     for (int i=1;i<=n;i++) f[i]=i;
26     memset(a,0,sizeof a);
27     memset(e,0,sizeof e);
28     m=0; //合法边数 
29     ans=0;
30     flag=1;
31 }
32 int getf(int u){
33     return u==f[u]?f[u]:f[u]=getf(f[u]);
34 }
35 
36 void merge(int u,int v){
37     f[getf(u)]=getf(v);
38 }
39 
40 void solve(){
41     cin>>q;
42     while (q--){
43         cin>>n;
44         ini();
45         for (int i=1;i<=n;i++) cin>>a[i].x>>a[i].y;
46         //添加合法边 
47         for (int i=1;i<n;i++){
48             for (int j=i+1;j<=n;j++){
49                 if (dis(a[i],a[j])>=10 && dis(a[i],a[j])<=1000) e[++m]={i,j,dis(a[i],a[j])};
50             }
51         }
52         //Kruscal
53         sort(e+1,e+1+m);
54         for (int i=1;i<=m;i++){
55             if (getf(e[i].from)!=getf(e[i].to)){
56                 ans+=e[i].w*100;
57                 merge(e[i].from,e[i].to);
58             }
59         }
60         //判断答案合法性 
61         for (int i=1;i<=n && flag;i++){
62             if (getf(i)!=getf(1)) flag=0;
63         }
64         if (flag) printf("%.1f
",ans);
65         else cout<<"oh!"<<endl;
66     }
67 }
68 
69 int main()
70 {
71     solve();
72     return 0;
73 }

 

以上是关于HDU1875的主要内容,如果未能解决你的问题,请参考以下文章

hdu 1875 畅通project再续

所有的畅通工程[HDU1232][HDU1874][HDU1875][HDU1879]

HDU1875(最小生成树)

HDU 1875 畅通工程再续

hdu1875 畅通工程再续最小生成树

HDU1875