HDU 1875

裸题呀~ 

无奈因为忘记排序wa了好几次~

代码比较丑,见谅~

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
int n,t,m,k;
int p[105];
struct Edge
{
  int u;
  int v;
  double w;
}edge[5010];
struct Island
{
  double x;
  double y;
}island[105];
bool cmp (Edge a ,Edge b)
{
  return a.w < b.w;
}
int find(int x)
{
  return p[x] == x ? x : x = find(p[x]);
}
double kruskal ()
{
  for(int i = 0;i < n;i ++)
  p[i] = i;
  sort(edge,edge + k,cmp);
  int num = 0;double ans = 0;
  for(int i = 0; i < k; i ++)
  {
    int p1 = find(edge[i].u);
    int p2 = find(edge[i].v);
    if(p1 != p2)
	{
	  ans += edge[i].w;
	  num ++;
	  p[p1]=find(p2);
	}
	if(num == n-1)
	return ans;
  }
  return -1;
}
int main()
{
	scanf("%d",&t);
	while(t --)
	{
	  scanf("%d",&n);
	  k = 0;
	  int flag = 1;
	  for(int i = 0;i < n;i ++)
	  {
	    scanf("%lf%lf",&island[i].x,&island[i].y);
	  }
	   for(int i = 0;i < n;i ++)
	    for(int j = i + 1;j < n;j ++)
		{
		 double p = sqrt((island[i].x - island[j].x)*(island[i].x - island[j].x) + (island[i].y - island[j].y) * (island[i].y - island[j].y));
         if(p >= 10 && p <= 1000)
		  {
		    edge[k].u = i;
		    edge[k].v = j;
		    edge[k].w = p;
		    k ++;
		  }
		}
      double ans;
      if(k >= n-1)
	  ans = kruskal();
	  else flag = 0;
      if(ans == -1 || flag == 0)
	  printf("oh!\n");
	  else
	  {
	    printf("%.1lf\n",ans*100);
	  }
	}

	return 0;
}

以前写的一种:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int c;
int p[105];
struct Edge
{
  int u;
  int v;
  double w;
}edge[10010];
bool cmp(Edge a,Edge b)
{
 return a.w<b.w;
}
int find(int x)
{
  return p[x]==x?x:p[x]=find(p[x]);
}
int main()
{
    int t;
    double x[105],y[105];
    scanf("%d",&t);
    while(t--)
    {
      double ans=0;
      bool flag=true;
      scanf("%d",&c);
      for(int i=0;i<c;i++)
      {
        scanf("%lf%lf",&x[i],&y[i]);
      }
      int m=0;
      for(int i=0;i<c;i++)
       for(int j=i;j<c;j++)
      {
        edge[m].u=i;
        edge[m].v=j;
        edge[m].w=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
        m++;
      }
      sort(edge,edge+m,cmp);
      for(int i=0;i<c;i++)
      p[i]=i;
      for(int i=0;i<m;i++)
      {
         int x=find(edge[i].u);
         int y=find(edge[i].v);
         if(x!=y)
         {
           if(edge[i].w<10)
           {
            continue;
           }
           else if(edge[i].w>1000)
           {
             flag=false;
             break;
           }
           else
           {
             ans+=edge[i].w;
             p[x]=y;

           }
         }
      }
      if(flag)
      printf("%.1lf\n",ans*100);
      else
      printf("oh!\n");

    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值