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

原创 2013年12月03日 17:20:26
杭电1875.
做这个题的时候,我以为两个小岛间的距离小于10米就是相通的,就把这两个小岛放到一个集合里去。结果wrong answer。另外如果在使用并查集的是有不路径压缩就会超时。并且因为是double型数,所以涉及到精度问题。distance>=10.0 && distance <= 100.000001 ;
代码如下:
#include <iostream>

#include <vector>

#include <algorithm>

#include <cmath>

#include <cstdio>

using namespace std;

typedef struct
{
  int a , b ;
  double distance ;
}Edge ;

vector<Edge>edge ;

double xa[202] ;

double yb[202] ;

double shortcost = 0.0 ;

int root[202] ;

int t , c , x , y ;

int leng  ;

bool com(Edge from , Edge to)
{
  return from.distance < to.distance ;
}

double dist(double x1 , double x2 , double y1 , double y2 )
{
 return sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2));
}
void makeset(int i)
{

  root[i] = i ;

}

int findfather(int i)
{
  int k , j ;

  j = i ;

  while(root[i] != i)
  {
   i = root[i] ;
  }
  while(j != i)
  {
   k = root[j] ;
   root[j] = i ;
   j = k ;
  }

  return i ;
}

void unio(int i , int j )
{

    root[i] = j ;

}

void kruskal()
{
  sort(edge.begin() , edge.end() , com) ;

  int s , t ;
  shortcost = 0.0 ;
  leng = c ;

  for(int i = 0; i < (int)edge.size(); i ++)
  {

    s = findfather(edge[i].a) ;
    t = findfather(edge[i].b) ;

    if(s != t)
    {
     if(edge[i].distance >= 10.000000 && edge[i].distance <= 1000.000001)
     {
      unio(s , t);
      shortcost += edge[i].distance * 100 ;
      leng --;
     }
    }
  }
}
int main()
{
 scanf("%d", &t) ;
 while(t--)
 {
  edge.clear();

  scanf("%d",&c);

  for(int i = 0; i < c; i ++)
  {
    scanf("%lf %lf",&xa[i], &yb[i]);
  }
  Edge temp ;

  for(int i = 0; i <c; i ++)
    for(int j = i+1 ; j < c; j ++)
  {
    temp.a = i ;
    temp.b = j ;
    temp.distance = dist(xa[i] , xa[j] , yb[i] , yb[j]) ;

    edge.push_back(temp) ;
  }
  for(int i = 0; i < c; i ++)
   makeset(i) ;
  kruskal();
  if(leng > 1)
    cout << "oh!" << endl ;
  else
   printf("%.1lf\n", shortcost) ;
 }
 return 0 ;
}

相关文章推荐

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

Problem Description 相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现。现在政府决定大力发展百岛湖,发展首先要解决的...

Least Common Multiple&&http://acm.hdu.edu.cn/showproblem.php?pid=1019

Problem Description The least common multiple (LCM) of a set of positive integers is the smallest p...

http://acm.hdu.edu.cn/showproblem.php?pid=1116&&Play on Words

Problem Description Some of the secret doors contain a very interesting word puzzle. The team of ar...

find the safest road&&http://acm.hdu.edu.cn/showproblem.php?pid=1596

最短路变形,求最长路即可。。。。 AC代码: #include #include #include #include #include #include #define N 1005 ...

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

昨天的一道比赛题,这么简单的图论题竟然没A,真的很受伤,,赛后听yyx的点拨后才明白,题意理解错了,题上给了n+1个点和n个路,并不是每个点都和学校相连(当时理解错误),然后枚举除学校的所有点当出口,...

Connect the Cities&&http://acm.hdu.edu.cn/showproblem.php?pid=3371

最小生成树变形题,不解释,这里输入量比较多,最好用一下输入外挂。。。 AC代码: #include #include #include #include #include #include #in...

http://acm.hdu.edu.cn/showproblem.php?pid=3549&&ISAP

网络流入门题,第一次用ISAP写网络流的题~~~~~ Improved SAP(ISAP)算法 ISAP字面意思是改良的最短增广路算法。关于ISAP,一位叫 DD_engi 的神牛讲非常清楚,...

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

题目大意:小希要做一个迷宫,迷宫中任意两个房间有且仅有一条路径可以相通(除非走了回头路)。 这样,就需要用到并查集了(赤裸裸的),对于输入的两个顶点,判断是否在同一个集合内,是的话,就是存在多条通路...

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

第一次写线段树题,写的是静态的飘过~~~ 线段树:它主要用于处理一段连续区间的插入,查找,统计,查询等操作。 复杂度: 设区间长度是n,所有操作的复杂度是logn级别。 一线段树的建...

Choose the best route(http://acm.hdu.edu.cn/showproblem.php?pid=2680)

模板题,一开始看题不仔细一直WAWAWa,之后发现公交车之间是单向的,而且有重边,这是就要取最小的那个值了。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:http://acm.hdu.edu.cn/showproblem.php?pid=1875
举报原因:
原因补充:

(最多只允许输入30个字)