zoukankan      html  css  js  c++  java
  • HDU 1875 畅通工程再续(kruskal)

    畅通工程再续

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 22650    Accepted Submission(s): 7231


    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
    #include <iostream>
    #include <string.h>
    #include <math.h>
    #include <algorithm>
    #include <stdlib.h>
    #include <stdio.h>
    
    using namespace std;
    struct Node
    {
    	int x;
    	int y;
    	double w;
    }a[100*100+5];
    int father[105];
    int n;
    int find(int x)
    {
    	if(x!=father[x])
    		father[x]=find(father[x]);
    	return father[x];
    }
    int b[105];
    int c[105];
    int cmp(Node a,Node b)
    {
    	return a.w<b.w;
    }
    double judge(int x,int y)
    {
    	double len=sqrt(1.0*(b[x]-b[y])*(b[x]-b[y])+1.0*(c[x]-c[y])*(c[x]-c[y]));
    	if(len>=10&&len<=1000)
    		return len;
    	return 0;
    }
    int main()
    {
    	int t;
    	scanf("%d",&t);
    	while(t--)
    	{
    		scanf("%d",&n);
    		for(int i=1;i<=n;i++)
    		{
    			scanf("%d%d",&b[i],&c[i]);
    		}
    		int cot=0;
    		for(int i=1;i<=n;i++)
    		{
                for(int j=i+1;j<=n;j++)
    			{
    				  double len=judge(i,j);
                      if(judge(i,j))
    				  {
    					  a[cot].x=i;
    					  a[cot].y=j;
    					  a[cot++].w=len*100;
    				  }
    			}
    		}
    		sort(a,a+cot,cmp);
    		for(int i=1;i<=n;i++)
    			father[i]=i;
    		double ans=0;
    		for(int i=0;i<cot;i++)
    		{
                  int xx=find(a[i].x);
    			  int yy=find(a[i].y);
    			  if(xx!=yy)
    			  {
    				  ans+=a[i].w;
    				  father[xx]=yy;
    			  }
    		}
    		int tag=0;
    		for(int i=1;i<=n;i++)
    		{
                 find(i);
    			 if(father[i]==i)
    				 tag++;
    		}
    		if(tag>=2)
    			printf("oh!
    ");
    		else
    			printf("%.1f
    ",ans);
    	}
    	return 0;
    
    }
    


     
  • 相关阅读:
    android常用组件
    android button点击效果
    service+activity
    收藏
    c++
    工厂模式
    lr常遇到一些问题
    lr介绍
    ((1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(6) NOT NULL)' at line 1"))
    mysqlclient 1.4.0 or newer is required; you have 0.10.0
  • 原文地址:https://www.cnblogs.com/dacc123/p/8228686.html
Copyright © 2011-2022 走看看