畅通project再续

Problem Description
相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其它的小岛时都要通过划小船来实现。

如今政府决定大力发展百岛湖。发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!

经过考察小组RPRush对百岛湖的情况充分了解后。决定在符合条件的小岛间建上桥,所谓符合条件,就是2个小岛之间的距离不能小于10米,也不能大于1000米。

当然,为了节省资金。仅仅要求实现随意2个小岛之间有路通就可以。当中桥的价格为 100元/米。

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

每组数据首先是一个整数C(C <= 100),代表小岛的个数。接下来是C组坐标。代表每一个小岛的坐标。这些坐标都是 0 <= x, y <= 1000的整数。
 
Output
每组输入数据输出一行,代表建桥的最小花费。结果保留一位小数。假设无法实现project以达到所有畅通,输出”oh!”.
 
Sample Input
2
2
10 10
20 20
3
1 1
2 2
1000 1000
 
Sample Output
1414.2
oh!
 
Author
8600
 
Source
 



AC代码:

kruskal:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
int per[111];
double x[111],y[111];
struct node{
int start,end;
double distance;
};
node p[10000];
int cmp(node a,node b) //距离从小到大
{
return a.distance < b.distance;
}
void init()
{
for(int i = 1;i < 111;i++ )
per[i] = i;
}
int find(int x)
{
if(x == per[x])
return x;
return per[x] = find(per[x]);
}
bool join(int x,int y)
{
int fx = find(x);
int fy = find(y);
if(fx != fy) //推断是否成环
{
per[fx] = fy;
return true; //没成环
}
return false;
}
int main()
{
int i,j,k;
int t,n,c;
double d,cost; //一定要注意题目所要求的数据类型
scanf("%d",&t);
while(t--)
{
init();
scanf("%d",&c);
for(i = 1;i <= c; i++)
{
scanf("%lf%lf",&x[i], &y[i]);
}
k = 0;
for(i = 1;i <= c;i++)
{
for(j = i+1;j <= c;j++)
{
d = sqrt( (x[j]-x[i])*(x[j]-x[i])+(y[j]-y[i])*(y[j]-y[i]) );//距离公式
if(d >=10.0 && d <= 1000.0) //一定要筛选完再存进结构体 要不然会WA.
{
p[k].start = i; //起点
p[k].end = j; //终点
p[k].distance = d;//起点到到终点的距离
k++;
}
}
}
sort(p,p+k,cmp); //按距离从小到大排序
int num = 0;
cost = 0.0;
for( i = 0;i < k; i++)
{
if(join(p[i].start, p[i].end))
cost += p[i].distance;
}
for( i = 1;i <= c;i++ )
{
if(per[i]==i)
num++;
if(num > 1) // 及时跳出循环节省时间
break;
}
if(num>1) //无法连接全部小岛
printf("oh!\n");
else
printf("%.1lf\n",100*cost);
}
return 0;
}



===============================切割线======================================

prim:

#include<cstdio>
#include<cstring>
#include<cmath>
#define mem(a, b) memset(a, (b), sizeof(a))
#define Wi(a) while(a--)
#define Si(a) scanf("%d", &a)
#define Pi(a) printf("%d\n", (a))
#define Pf(a) printf("%.1lf\n", (a))
#define INF 0x3f3f3f
double map[150][150];
int x[150],y[150];
int n;
double d[150], vis[150];
void prim()
{
mem(vis, 0);
int i, j, k;
double ans = 0, minn;
for(i = 1; i <= n; i++)
d[i] = map[1][i];
vis[1] = 1;
for(i = 1; i < n; i++)
{
k = 1;
minn = INF;
for(j = 1; j <= n; j++)
{
if(!vis[j] && d[j] < minn)
{
minn = d[j];
k = j;
}
}
if(minn == INF){
puts("oh!");return;
}
vis[k] = 1;
ans += minn;
for(j = 1; j <= n; j++)
{
if(!vis[j] && d[j] > map[j][k])
d[j] = map[j][k];
}
}
Pf(ans*100);
}
int main(){
int t; Si(t);
Wi(t){
Si(n);
int i , j, k;
for(i = 1; i <= n; i++)
{
scanf("%d%d", &x[i], &y[i]);
}
for(i = 1; i <= n; i++)
{
for(j = 1; j <= n; j++)
{
double d = sqrt( (x[i]-x[j])*(x[i]-x[j]) + (y[i]-y[j])*(y[i]-y[j]));
if(d >= 10.0 && d <= 1000.0)
map[i][j] = map[j][i] = d;
else
map[i][j] = map[j][i] = INF;
}
map[i][i] = 0;
}
prim();
}
return 0;
}



hdoj 1875 畅通project再续【最小生成树 kruskal &amp;&amp; prim】的更多相关文章

  1. hdu 1875 畅通project再续(kruskal算法计算最小生成树)

    畅通project再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

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

    畅通工程再续 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  3. HDU 1875 畅通project再续 (最小生成树 水)

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

  4. Hdoj 1875.畅通工程再续 题解

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

  5. hdoj 1875 畅通工程再续

    题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1875 //9403289 2013-10-24 17:00:49 Accepted 1875 62M ...

  6. (step6.1.3)hdu 1875(畅通工程再续——最小生成树)

    题目大意:本题是中文题,可以直接在OJ上看 解题思路:最小生成树 1)本题的关键在于把二维的点转化成一维的点 for (i = 0; i < n; ++i) { scanf("%d%d ...

  7. hdu 1875 畅通project再续

    链接:hdu 1875 输入n个岛的坐标,已知修桥100元/米,若能n个岛连通.输出最小费用,否则输出"oh!" 限制条件:2个小岛之间的距离不能小于10米,也不能大于1000米 ...

  8. hdu1875 畅通工程再续 最小生成树并查集解决---kruskal

    http://acm.hdu.edu.cn/showproblem.php?pid=1875 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的 ...

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

    畅通工程再续 题目链接: http://acm.hust.edu.cn/vjudge/contest/124434#problem/M Description 相信大家都听说一个"百岛湖&q ...

随机推荐

  1. 【Luogu】P2617Dynamic Ranking(树状数组套主席树)

    题目链接 树状数组套主席树有点难懂qwq 不好理解 树状数组套主席树的直观理解应该是:树状数组的每一个节点是一棵主席树. 普通区间修改我们是创建1个线段树,树状数组套主席树的时候我们就创建log个线段 ...

  2. 【Luogu】P3628特别行动队(斜率优化DP)

    题目链接 设c[i]是战斗力前缀和,f[i]是考虑前i个,且最后一组分到第i个士兵为止的战斗力之和 则有朴素状态转移方程 ;i<=n;++i) ;j<i;++j){ int x=c[i]- ...

  3. BZOJ 2140 稳定婚姻 ——二分图

    论二分图的可行边与必须边. 考虑用dinic增广之后的图,一些是必要的割边,一些是可行的割边. 我们首先求出一组可行的最大匹配,那么这些变都是可行的. 然后我们求一遍强连通分量. 如果 scc[u]! ...

  4. android开发里跳过的坑——TimePickerDialog onTimeSet不回调

    在android6.0.1上测试发现TimePickerDialog的onTimeSet和DatePickerDialog的onDateSet不回调,查看SDK源码发现,TimePickerDialo ...

  5. Log4j2异步情况下怎么防止丢日志的源码分析以及队列等待和拒绝策略分析

    org.apache.logging.log4j.core.async.AsyncLoggerConfigDisruptor以下所有源码均在此类中首先我们看下log4j2异步队列的初始化 从这里面我们 ...

  6. android soap webservers 无法执行 报错 ht.call(SOAP_ACTION, envelope);解决方法

    1.可能没有加入网络访问权限,在Manifest里面加入,<uses-permission android:name="android.permission.INTERNET" ...

  7. 巧克力王国 BZOJ 2850

    巧克力王国 [问题描述] 巧克力王国里的巧克力都是由牛奶和可可做成的.但是并不是每一块巧克力都受王国人民的欢迎,因为大家都不喜欢过于甜的巧克力.对于每一块巧克力,我们设x和y为其牛奶和可可的含量.由于 ...

  8. POJ 1182 食物链 [并查集 带权并查集 开拓思路]

    传送门 P - 食物链 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit  ...

  9. JS标签获取另一个页面传过来的href值

    a href=b.html?id=楼主>B页面</a>b.html中的获取函数:function getParam(){C1=window.location.href.split(& ...

  10. Free web scraping | Data extraction | Web Crawler | Octoparse, Free web scraping

    Free web scraping | Data extraction | Web Crawler | Octoparse, Free web scraping 人才知了