hdoj 1875 畅通工程再续(最小生成树)

畅通工程再续

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

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 17029    Accepted Submission(s): 5302

Problem Description

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

Input

输入包括多组数据。输入首先包括一个整数T(T <= 200),代表有T组数据。

每组数据首先是一个整数C(C <= 100),代表小岛的个数,接下来是C组坐标,代表每个小岛的坐标,这些坐标都是 0 <= x, y <= 1000的整数。

Output

每组输入数据输出一行,代表建桥的最小花费,结果保留一位小数。如果无法实现工程以达到全部畅通,输出”oh!”.

Sample Input

2
2
10 10
20 20
3
1 1
2 2
1000 1000

Sample Output

1414.2
oh!

Author

8600

Source

2008浙大研究生复试热身赛(2)——全真模拟

今天做题得出了一个天大的关于并查集中某些方面的 教训:

在 查找根节点的过程中注意数组的越界(稍不留神那个你就越雷池半步了,我也是醉了),这道题是我以16次Runtime Error(STACK_OVERFLOW)  的血的教训得来的额,以后我得注意查找根节点时最好需要路径压缩一下,这下子终于体会到路径压缩的好处了

/*AC*/

#include<cstdio>

#include<cmath>

#include<cstring>

#include<cstdlib>

#include<algorithm>

using namespace std;

const int M=105;

int pre[M];

struct node

{

int start;

int end;

}island[M];

struct dis

{

int x;

int y;

double value;

}num[M*M];

int find(int x)

{

int r=x;

while(pre[r]!=r)//返回根节点

r=pre[r];

int i=x,j;

while(i!=r)//路径压缩

{

j=pre[i];//临时储存

pre[i]=r;//将上次的结点改为根节点

i=j;

}

return r;

void  merge(int x,int y)

{

int fx=find(x);

int fy=find(y);

if(fx!=fy)

pre[fx]=fy;

}

double Dis(node a,node b)

{

return sqrt(1.0*((a.start-b.start)*(a.start-b.start)+(a.end-b.end)*(a.end-b.end)));

}

int jude(double d)

{

if(d>=10&&d<=1000)

return 1;

else

return 0;

}

int cmp(dis a,dis b)

{

return a.value<b.value;

}

int main()

{

int T;

scanf("%d",&T);

while(T--)

{

int C,i,j,k;

scanf("%d",&C);

 if(C==1)

{

printf("0.0\n");

continue;

}

for(i=0;i<=M;i++)

pre[i]=i;

for(i=1;i<=C;i++)

scanf("%d%d",&island[i].start,&island[i].end);

k=0;

memset(num,0,sizeof(num));

for(i=1;i<=C;i++)

for(j=i+1;j<=C;j++)

{

double dis=Dis(island[i],island[j]);

if(jude(dis))

{

num[k].x=i;

num[k].y=j;

num[k].value=dis;

k++;

}

}

 sort(num,num+k,cmp);

double ans=0.0;

for(i=0;i<k;i++)

if(find(num[i].x)!=find(num[i].y)&&jude(num[i].value))

{

merge(num[i].x,num[i].y);

 ans+=num[i].value;

}

 int count=0;

for(i=1;i<=C;i++)//判断未联通的路径

{

if(pre[i]==i)

count++;

if(count>1)

break;

}

if(count>1)

printf("oh!\n");

else

printf("%.1lf\n",ans*100);

}

return 0;

}

/*Runtime Error

(STACK_OVERFLOW)*/

#include<cstdio>

#include<cmath>

#include<cstring>

#include<cstdlib>

#include<algorithm>

using namespace std;

const int M=105;

int pre[M];

struct node

{

int start;

int end;

}island[M];

struct dis

{

int x;

int y;

double value;

}num[M*M];

int find(int x)

{

return x==pre[x]?x:pre[x]==find(pre[x]);//没有经过路径压缩

}

void  merge(int x,int y)

{

int fx=find(x);

int fy=find(y);

if(fx!=fy)

pre[fx]=fy;

}

double Dis(node a,node b)

{

return sqrt(1.0*((a.start-b.start)*(a.start-b.start)+(a.end-b.end)*(a.end-b.end)));

}

int jude(double d)

{

if(d>=10&&d<=1000)

return 1;

else

return 0;

}

int cmp(dis a,dis b)

{

return a.value<b.value;

}

int main()

{

int T;

scanf("%d",&T);

while(T--)

{

int C,i,j,k;

scanf("%d",&C);

if(C==1)

{

printf("0.0\n");

continue;

}

for(i=0;i<=M;i++)

pre[i]=i;

for(i=1;i<=C;i++)

scanf("%d%d",&island[i].start,&island[i].end);

k=0;

memset(num,0,sizeof(num));

for(i=1;i<=C;i++)

for(j=i+1;j<=C;j++)

{

double dis=Dis(island[i],island[j]);

if(jude(dis))

{

num[k].x=i;

num[k].y=j;

num[k].value=dis;

k++;

}

}

sort(num,num+k,cmp);

double ans=0.0;

for(i=0;i<k;i++)

if(find(num[i].x)!=find(num[i].y)&&jude(num[i].value))

{

merge(num[i].x,num[i].y);

ans+=num[i].value;

}

int count=0;

for(i=1;i<=C;i++)

{

if(pre[i]==i)

count++;

if(count>1)

break;

}

if(count>1)

printf("oh!\n");

else

printf("%.1lf\n",ans*100);

}

return 0;

}

时间: 2024-10-06 11:14:45

hdoj 1875 畅通工程再续(最小生成树)的相关文章

HDU 1875 畅通工程再续 (最小生成树)

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

HDU - 1875畅通工程再续-最小生成树

HDU - 1875 畅通工程再续 Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Status Description 相信大家都听说一个"百岛湖"的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组RPRush对百岛湖的情

hdoj 1875 畅通工程再续【最小生成树 kruskal 算法】

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

hdoj 1875 畅通工程再续

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

HDU 1875 畅通工程再续 (最小生成树prim)

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

HDU ACM : 1875 畅通工程再续-&gt;最小生成树(并查集)

解析:最小生成树:Kruskal 算法:并查集实现. 1.首先找出符合要求的边: 2.对找出的边排序: 3.并查集找出n-1条边,无法修通n-1条路则无法实现要求. #include<iostream> #include<cmath> #include<algorithm> using namespace std; struct Point { int x,y; } point[102]; struct Edge { int a,b; double v; bool op

HDU 1875 畅通工程再续 (最小生成树 水)

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

hdu 1875 畅通工程再续 (最小生成树)

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

hdu 1875 畅通工程再续(Kruskal算法)

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