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的主要内容,如果未能解决你的问题,请参考以下文章