最小生成树prime版

大致的步骤

首先选取一个到集合最近的点 然后标记起在集合内部 然后更新最短距离

畅通工程再续

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

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
 
Sample Output
1414.2
oh!
 
#include<cstdio>
#include<iostream>
#include<string.h>
#include<cmath>
#define maxn 105
#define inf 9999999
struct node
{

double
x,y;
}
stu[maxn];
int
vis[maxn],n;//用来表示点是否在集合里
double mincost[maxn];//用来记录从集合出来到每个点的最小距离
double mapp[maxn][maxn];
using namespace
std;
double
get_len(node a,node b)
{

return
sqrt(pow(a.x-b.x,2.0)+pow(a.y-b.y,2.0));
}

void
build_map()
{

for
(int i=;i<=n;i++)
{

for
(int j=i;j<=n;j++)
{

double
len=get_len(stu[i],stu[j]);
if
(len>=&&len<=)
mapp[i][j]=mapp[j][i]=(i==j)?:len;
else
mapp[i][j]=mapp[j][i]=inf;
}
}
}

void
init()
{

memset(vis,,sizeof(vis));
}

double
minn(double x,double y)
{

if
(x-y>) return y;
else return
x;
}

double
prim()
{

fill(mincost,mincost+n+,inf);
mincost[]=;
double
res=;
while
()
{

int
v=-;
for
(int i=;i<=n;i++) if(!vis[i]&&(v==-||mincost[i]<mincost[v])) v=i;//找出离集合最近的点
if(v==-) break;
vis[v]=;
res+=mincost[v];
for
(int i=;i<=n;i++) mincost[i]=minn(mincost[i],mapp[v][i]);//更新最小距离
}

return
res;
}

int
main()
{

cin.sync_with_stdio(false);
int
t;
scanf("%d",&t);
while
(t--)
{

init();
scanf("%d",&n);
for
(int i=;i<=n;i++) scanf("%lf %lf",&stu[i].x,&stu[i].y);
build_map();
double
temp=prim()*100.0;
if
(temp>inf) printf("oh!\n");
else
printf("%.1f\n",temp);
}

return
;
}

#include<cstdio>#include<iostream>#include<string.h>#include<cmath>#define maxn 105#define inf 9999999struct node{    double x,y;}stu[maxn];int vis[maxn],n;//用来表示点是否在集合里 double mincost[maxn];//用来记录从集合出来到每个点的最小距离 double mapp[maxn][maxn];using namespace std;double get_len(node a,node b){return sqrt(pow(a.x-b.x,2.0)+pow(a.y-b.y,2.0));}void build_map(){for(int i=1;i<=n;i++){for(int j=i;j<=n;j++){double len=get_len(stu[i],stu[j]);if(len>=10&&len<=1000)mapp[i][j]=mapp[j][i]=(i==j)?0:len;else mapp[i][j]=mapp[j][i]=inf;}}}void init(){memset(vis,0,sizeof(vis));}double minn(double x,double y){if(x-y>0) return y;else return x;}double prim(){fill(mincost,mincost+n+1,inf);mincost[1]=0;double res=0;    while(1)    {    int v=-1;    for(int i=1;i<=n;i++)if(!vis[i]&&(v==-1||mincost[i]<mincost[v])) v=i;//找出离集合最近的点     if(v==-1) break;    vis[v]=1;res+=mincost[v];for(int i=1;i<=n;i++) mincost[i]=minn(mincost[i],mapp[v][i]);    }    return res;}int main(){cin.sync_with_stdio(false);int t;    scanf("%d",&t);while(t--)    {    init();    scanf("%d",&n);    for(int i=1;i<=n;i++) scanf("%lf %lf",&stu[i].x,&stu[i].y);        build_map();        double temp=prim()*100.0;        if(temp>inf) printf("oh!\n");        else printf("%.1f\n",temp);    }return 0;}

hdu 1875 最小生成树 prime版的更多相关文章

  1. HDU 1875 最小生成树prim算法

    #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #inc ...

  2. HDU 1875(最小生成树)

    #include <iostream> #include <algorithm> #include <cstdio> #include <cmath> ...

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

    B - 畅通工程再续 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit S ...

  4. HDU 1875 畅通工程再续 (Prim)

    题目链接:HDU 1875 Problem Description 相信大家都听说一个"百岛湖"的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现 ...

  5. 最小生成树 prime poj1258

    题意:给你一个矩阵M[i][j]表示i到j的距离 求最小生成树 思路:裸最小生成树 prime就可以了 最小生成树专题 AC代码: #include "iostream" #inc ...

  6. 最小生成树 prime + 队列优化

    存图方式 最小生成树prime+队列优化 优化后时间复杂度是O(m*lgm) m为边数 优化后简直神速,应该说对于绝大多数的题目来说都够用了 具体有多快呢 请参照这篇博客:堆排序 Heapsort / ...

  7. hdu 1875 畅通project再续

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

  8. HDU 1233(最小生成树)

    HDU 1233(最小生成树 模板) #include <iostream> #include <algorithm> #include <cstdio> usin ...

  9. hdu 1875 畅通工程再续(prim方法求得最小生成树)

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

随机推荐

  1. 艺赛旗RPA谷歌浏览器拾取

    rpa通过chrome拾取,操作步骤如下 方法一: 1>安装谷歌访问助手 直接下载:谷歌访问助手 官方下载地址:https://github.com/haotian-wang/google-ac ...

  2. python 设计模式之中介者模式

    #先啰嗦一下 至少半个多月的样子没写博客了,月初去了趟黄山,赏了美景,自然没时间也没条件敲博客了,一个多星期就这么过去了.返回深圳后,工作积压了一堆,然后白天就马不停蹄的忙工作,晚上回家伺候小娃,又想 ...

  3. python操作excel实用脚本

    import xlrd data = xlrd.open_workbook('/home/ppe/workspace/pythonwp/tianranqi_org.xls') table = data ...

  4. Java并发包之线程池概述

    前言 线程池的作用就是将线程的管理.创建.销毁等操作与线程需要执行的任务隔离开来,从而避免线程频繁的创建与销毁,以及大量的线程的上下文切换造成的资源损耗.关于Java并发包中的线程池部分,我把它们分为 ...

  5. js事件函数中(ev)是什么鬼?

    首先,从ev所在的位置就可以得知,ev是参数. 在ev中包含了事件触发时的函数, 比如: click事件的ev中包含着e.pageX,e.pageY keydown事件中包含着ev.keyCode等 ...

  6. 008-多线程-JUC集合-Queue-LinkedBlockingQueue

    一.概述 LinkedBlockingQueue是一个单向链表实现的阻塞队列.该队列按 FIFO(先进先出)排序元素,新元素插入到队列的尾部,并且队列获取操作会获得位于队列头部的元素.链接队列的吞吐量 ...

  7. curl 的用法指南

    简介 curl 是常用的命令行工具,用来请求 Web 服务器.它的名字就是客户端(client)的 URL 工具的意思. 它的功能非常强大,命令行参数多达几十种.如果熟练的话,完全可以取代 Postm ...

  8. pycharm连接linux创建django工程

    windows中安装最新版pycharm--2018年10月的版本 点击创建工程,看下图: C:\Users\Lenovo\PycharmProjects\untitled4 这个路径不要动,一动就出 ...

  9. Jquery Ajax WebService

    仅供参考 ws.aspx 代码 <script type="text/javascript"> $(function () { $.ajax({ type: " ...

  10. Unity与Android刘海屏适配

    本周学习Unity与Android刘海屏适配 关于刘海屏适配部分 网上有很多教程 这里只是做一下整理 https://blog.csdn.net/xj1009420846/article/detail ...