hdu1875

http://acm.hdu.edu.cn/showproblem.php?pid=1875

  1 //最小生成树
  2 #include<iostream>
  3 #include<stdio.h>
  4 #include<math.h>
  5 #include<string.h>
  6 #include<stdlib.h>
  7 using namespace std;
  8 const int N=5005;
  9 int father[N];
 10 int n,m,g;
 11 struct stu{
 12     int n;
 13     int x;
 14     int y;
 15 }q[N];
 16 struct ln{
 17     int u;
 18     int v;
 19     double w;
 20 }p[N];
 21
 22 int cmp(const void *a,const void *b)
 23 {
 24     return (*(struct ln*)a).w >(*(struct ln*)b).w ?1:-1;
 25 }
 26
 27 int find(int x)
 28 {
 29     if(father[x]!=x)
 30     father[x]=find(father[x]);
 31     return father[x];
 32 }
 33 int make(int a,int b)
 34 {
 35     int h=0;
 36     int f1=find(a);
 37     int f2=find(b);
 38     if(f1<f2)
 39     {
 40         father[f2]=f1;
 41         h=1;
 42     }
 43     else if(f1>f2)
 44     {
 45         father[f1]=f2;
 46         h=1;
 47     }
 48     return h;
 49 }
 50
 51 double kruskal()
 52 {
 53     double s=0;
 54     int k=0;
 55     for(int i=0;i<m;i++)
 56     {
 57         if(make(p[i].u,p[i].v))
 58         {
 59             if(p[i].w==5000)
 60             g=1;
 61             s+=p[i].w;
 62             k++;
 63         }
 64         if(k==n-1)
 65         return s*100;
 66     }
 67     return s*100;
 68 }
 69
 70 void zuhe()//道路分析
 71 {
 72     int k=0;
 73     for(int i=1;i<=n;i++)
 74     {
 75         for(int j=i+1;j<=n;j++,k++)
 76         {
 77             p[k].u=i;
 78             p[k].v=j;
 79             p[k].w=sqrt((q[i].x-q[j].x)*(q[i].x-q[j].x)+(q[i].y-q[j].y)*(q[i].y-q[j].y));
 80             if(p[k].w<10 || p[k].w>1000)
 81             {
 82                 p[k].w=5000;
 83             }
 84             //printf("%d %d %lf\n",p[k].u,p[k].v,p[k].w);
 85         }
 86     }
 87 }
 88
 89 int main()
 90 {
 91     //freopen("in.txt","r",stdin);
 92     int t;
 93     double s;
 94     scanf("%d",&t);
 95     while(t--)
 96     {
 97         g=0;
 98         scanf("%d",&n);
 99         m=n*(n-1)/2;
100         for(int i=1;i<=n;i++)
101         {
102             father[i]=i;
103         }
104         for(int i=1;i<=n;i++)
105         {
106             q[i].n=i;
107             scanf("%d%d",&q[i].x,&q[i].y);
108         }
109         zuhe();
110         qsort(p,m,sizeof(struct ln),cmp);
111         s=kruskal();
112         if(g==1)
113         {
114             printf("oh!\n");
115             continue;
116         }
117         printf("%.1lf\n",s);
118     }
119     return 0;
120 }
时间: 2025-01-11 10:50:49

hdu1875的相关文章

hdu1875浅谈prim算法的朴素实现

阅读原题 题目大意 给你几个(<=100)小岛的坐标,然后你把所有的岛都修上桥连接起来,求最小花费,还有个附加的限制:只有岛之间的距离大于等于10,或小于等于1000时才能修桥. 大概是因为十米以内不用建桥,千米以上无法建桥.哈哈,说着玩的. 很明显这是一道MST(最小生成树)的题目,貌似也有人用并查集AC过. 最小生成树算法 概述 最小生成树的常用算法有两个kruskal和prim算法.两者都是不停地执行归并操作,然而一言以蔽之,两者的不同之处在于:kruskal----归并边:prim---

ACM-最小生成树之畅通工程再续——hdu1875

***************************************转载请注明出处:http://blog.csdn.net/lttree*************************************** 畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 13547    Accepted Submis

HDU1875 畅通工程再续 【最小生成树Prim】

畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 14590    Accepted Submission(s): 4497 Problem Description 相信大家都听说一个"百岛湖"的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先

【HDU1875】畅通工程再续(MST基础题)

更改成实形数即可.第一次敲完直接交,CE了一次.晕. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <cstdio> 5 #include <cctype> 6 #include <cmath> 7 #include <algorithm> 8 #include <numeric> 9 10 #define t

HDU1875——畅通工程再续(最小生成树:Kruskal算法)

畅通工程再续 Description相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组RPRush对百岛湖的情况充分了解后,决定在符合条件的小岛间建上桥,所谓符合条件,就是2个小岛之间的距离不能小于10米,也不能大于1000米.当然,为了节省资金,只要求实现任意2个小岛之间有路通即可.其中桥的价格为 100元/米. Input输入

HDU1875(最小生成树)

畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 21693    Accepted Submission(s): 6856 Problem Description 相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题

hdu1875 畅通工程再续 并查集+kruskal最小生成树

Problem Description 相信大家都听说一个"百岛湖"的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组RPRush对百岛湖的情况充分了解后,决定在符合条件的小岛间建上桥,所谓符合条件,就是2个小岛之间的距离不能小于10米,也不能大于1000米.当然,为了节省资金,只要求实现任意2个小岛之间有路通即可.其中桥的价格为 100元/米.

hdu1875 最小生成树并查集解决---kruskal

http://acm.hdu.edu.cn/showproblem.php?pid=1875 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的选拔 畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 17737    Accepted Submission(s): 553

HDU1875 畅通工程再续【Prim】

畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 16103    Accepted Submission(s): 5000 Problem Description 相信大家都听说一个"百岛湖"的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先