hdu 1875 给出每个结点的坐标 权值为两点间的距离 (MST)

Sample Input
2
2
10 10 //坐标
20 20
3
1 1
2 2
1000 1000

Sample Output
1414.2   //最小权值和*100  保留1位小数
oh!       //不连通

prim

 1 # include <iostream>
 2 # include <cstdio>
 3 # include <cstring>
 4 # include <algorithm>
 5 # include <cmath>
 6 # define LL long long
 7 using namespace std ;
 8
 9 const int INF=0x3f3f3f3f;
10 const int MAXN=110;
11 bool vis[MAXN];
12 double lowc[MAXN];
13 int n ;
14 double cost[MAXN][MAXN] ;
15
16 struct poin
17 {
18     int x ;
19     int y ;
20 }p[110];
21
22 double Prim()//点是0~n-1
23 {
24     double ans=0;
25     memset(vis,false,sizeof(vis));
26     vis[0]=true;
27     for(int i=1;i<n;i++)lowc[i]=cost[0][i];
28     for(int i=1;i<n;i++)
29     {
30         double minc=INF;
31         int p=-1;
32         for(int j=0;j<n;j++)
33             if(!vis[j]&&minc>lowc[j])
34             {
35                 minc=lowc[j];
36                 p=j;
37             }
38             if(minc==INF)return -1;//原图不连通
39             ans+=minc;
40             vis[p]=true;
41             for(int j=0;j<n;j++)
42                 if(!vis[j]&&lowc[j]>cost[p][j])
43                     lowc[j]=cost[p][j];
44     }
45     return ans;
46 }
47
48 int main()
49 {
50
51    // freopen("in.txt","r",stdin) ;
52     int T ;
53     scanf("%d" , &T) ;
54     while(T--)
55     {
56         scanf("%d" , &n) ;
57         int i , j ;
58         for (i = 0 ; i < n ; i++)
59             for (j = 0 ; j < n ; j++)
60                cost[i][j] = INF ;
61         for (i = 0 ; i < n ; i++)
62             scanf("%d %d" , &p[i].x , &p[i].y) ;
63         for (i = 0 ; i < n ; i++)
64             for (j = i+1 ; j < n ; j++)
65             {
66                 double t = sqrt((double)(p[i].x - p[j].x) * (p[i].x - p[j].x) + (p[i].y - p[j].y) * (p[i].y - p[j].y)) ;
67                 if (t <10.0 || t > 1000.0)
68                     continue ;
69                 cost[i][j] = t ;
70                 cost[j][i] = t ;
71             }
72         double k = Prim() ;
73         if (k == -1)
74             printf("oh!\n") ;
75         else
76             printf("%.1lf\n" , k*100) ;
77
78     }
79     return 0 ;
80 }

时间: 2024-10-11 09:39:47

hdu 1875 给出每个结点的坐标 权值为两点间的距离 (MST)的相关文章

HDU 2001 计算两点间的距离

Problem Description 输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离. Input 输入数据有多组,每组占一行,由4个实数组成,分别表示x1,y1,x2,y2,数据之间用空格隔开. Output 对于每组输入数据,输出一行,结果保留两位小数. Sample Input 0 0 0 1 0 1 1 0 Sample Output 1.00 1.41 题意:输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离. #include <stdio.h>

ios根据gps坐标来计算两点间的距离

//ios根据gps坐标来计算两点间的距离 //x1,y1 点1的坐标 x2,y2点2的坐标 -(double) gps2m:(double)x1 _y1:(double)y1 _x2:(double)x2 _y2:(double)y2{ double radLat1 = (x1 * 3.1416 / 180.0); double radLat2 = (x2 * 3.1416 / 180.0); double a = radLat1 - radLat2; double b = (y1 - y2)

HDOJ/HDU 2547 无剑无我(两点间的距离)

Problem Description 北宋末年,奸臣当道,宦官掌权,外侮日亟,辽军再犯.时下战火连连,烽烟四起,哀鸿遍野,民不聊生,又有众多能人异士群起而反,天下志士云集响应,景粮影从. 值此危急存亡之秋,在一个与世隔绝的地方-MCA山上一位江湖人称<英雄哪里出来>的人正在为抗击辽贼研究剑法,终于于一雷电交加之夜精确计算出了荡剑回锋的剑气伤害公式. 定义 f(x, y, m, n) = sqrt(x*x + y*y + m*m + n*n - 2*m*x - 2*n*y); hint : s

HDU 6214 Smallest Minimum Cut 最小割,权值编码

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6214 题意:求边数最小的割. 解法: 建边的时候每条边权 w = w * (E + 1) + 1; 这样得到最大流 maxflow / (E + 1) ,最少割边数 maxflow % (E + 1) 道理很简单,如果原先两类割边都是最小割,那么求出的最大流相等 但边权变换后只有边数小的才是最小割了 乘(E+1)是为了保证边数叠加后依然是余数,不至于影响求最小割的结果 因为假设最小割=k,那么现在新

HDU 3887 Counting Offspring(DFS序求子树权值和)

Problem Description You are given a tree, it's root is p, and the node is numbered from 1 to n. Now define f(i) as the number of nodes whose number is less than i in all the succeeding nodes of node i. Now we need to calculate f(i) for any possible i

hdu 1875 畅通project再续

链接:hdu 1875 输入n个岛的坐标,已知修桥100元/米,若能n个岛连通.输出最小费用,否则输出"oh!" 限制条件:2个小岛之间的距离不能小于10米,也不能大于1000米 分析:由于岛的坐标已知,所以两两之间的距离能够算出,再推断一下距离是否符合条件 #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define d 0.0001 int f[

poj 2031 给出每个结点的3维坐标 以及结点的半径 (MST)

3维空间中有N个圆球,给出x y z 以及圆球的半径 ,求最小生成树 边的权值为两个圆球间的距离 如果圆球相互接触 则权值为0 求最小的权值和 Sample Input 3 //n10.000 10.000 50.000 10.000 //x y z r40.000 10.000 50.000 10.00040.000 40.000 50.000 10.000230.000 30.000 30.000 20.00040.000 40.000 40.000 20.00055.729 15.143

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 相信大家都听说一个"百岛湖"的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政

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

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