HDU1875 畅通工程再续【最小生成树】
题意:
在这些小岛中建设最小花费的桥,但是一座桥的距离必须在10 -- 1000之间。
思路:
用最小生成树解决吧,就那两个算法。
代码:
prim
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath> using namespace std;
#define N 105
#define inf 0x3f3f3f3f int n,i,j,x[N],y[N];
double map[N][N];
bool vis[N];//标记是否已经放入最小生成树的那个集合里了
double low[N];//记录不在已经加入最小生成树的这个集合里的元素到这个 集合的最小距离 double dis(int i,int j)
{
return sqrt(1.0*(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
} void init()
{
for(i=;i<=n;++i)
cin>>x[i]>>y[i];
for(i=;i<=n;++i)
for(j=;j<=n;++j)
{
map[i][j]=dis(i,j);
if(map[i][j]>||map[i][j]<)
{
map[i][j]=inf;
}
}
} void prim()
{
double sum=;
memset(vis,,sizeof(vis));
int pos=;//从1开始
for(i=;i<=n;++i)//第一次给low赋值
{
low[i]=map[][i];
}
vis[]=;
//已经找到一个点1,再找n-1个
for(i=;i<n;++i)
{
double min=inf;
for(j=;j<=n;++j)
{
if(!vis[j]&&min>low[j])//找下一个点到这个集合的最小值
{
min=low[j];//记下这个最小值
pos=j;//记下这个点
}
}
if(min==inf)
{
cout<<"oh!"<<endl;
return ;
}
sum+=min;
vis[pos]=;//把刚刚找到的这个点加入集合
for(j=;j<=n;++j) //更新low数组
{
if(!vis[j]&&low[j]>map[pos][j])
{
low[j]=map[pos][j];
}
}
}
printf("%.1lf\n",sum*);
} int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n;
init();
prim();
}
return ;
}
kruskal
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
struct Island
{
int x,y;
};
struct node
{
int u,v;
double w;
};
Island arr[];
node edge[];
int per[];
int n;
bool cmp(node a,node b)
{
return a.w<b.w;
}
void init()
{
for(int i=;i<=n;++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 ;
}
return ;
}
int main()
{
int T;
int i,j,k;
double x,y;
scanf("%d",&T);
while(T--)
{ scanf("%d",&n);
init();
for(i=;i<=n;++i)
{
scanf("%d%d",&arr[i].x,&arr[i].y);
}
//m=n*(n-1)/2;
k=;
for(i=;i<=n;++i)//把所有路记录在node结构体中
{
for(j=i+;j<=n;++j)
{
edge[k].u=i;
edge[k].v=j;
x=(arr[j].y-arr[i].y)*(arr[j].y-arr[i].y);
y=(arr[j].x-arr[i].x)*(arr[j].x-arr[i].x);
double temp=sqrt(x+y);
edge[k++].w=temp;
}
}
sort(edge,edge+k,cmp);
double sum=;
for(i=;i<k;++i)
{
if(edge[i].w<=&&edge[i].w>=&&join(edge[i].u,edge[i].v))//如果两个岛的距离不符合要求就会把join(edge[i].u,edge[i].v)短路
{
sum+=edge[i].w;
}
}
int cnt=;
bool flag=;
for(i=;i<=n;++i)//短路了就不会执行了,也就不会连接了,就只需要判断根节点的个数
{
if(i==per[i]) cnt++;
if(cnt>) //不等于1就还有元素(小岛)没连起来,不满足题意
{
flag=;
break;
}
}
if(flag) printf("oh!\n");
else
printf("%.1lf\n",sum*);
}
return ;
}
HDU1875 畅通工程再续【最小生成树】的更多相关文章
- HDU1875——畅通工程再续(最小生成树:Kruskal算法)
畅通工程再续 Description相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当 ...
- hdu1875 畅通工程再续 最小生成树并查集解决---kruskal
http://acm.hdu.edu.cn/showproblem.php?pid=1875 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的 ...
- HDU 1875 畅通工程再续 (最小生成树)
畅通工程再续 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- HDU1875 畅通工程再续 (并查集)
畅通工程再续 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- HDU1875 畅通工程再续 2017-04-12 19:52 48人阅读 评论(0) 收藏
畅通工程再续 Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submis ...
- HDU-1875 畅通工程再续(最小生成树+判断是否存在)
http://acm.hdu.edu.cn/showproblem.php?pid=1875 Problem Description 相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛 ...
- hdu1875 畅通工程再续 并查集/最小生成树
相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全 ...
- hdu1875 畅通工程再续 暴力+基础最小生成树
#include<cstdio> #include<cmath> #include<algorithm> using namespace std; ; ; ; in ...
- B - 畅通工程再续 最小生成树
相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全 ...
随机推荐
- Python——socketsever模块
1.作用:同时与多个客户端通信 import socketserver class MyServer(skcketserver.BaseRequestHandler): def handle(self ...
- Lodop设置文本项行间距、字间距
LODOP给文本项ADD_PRINT_TEXT设置字间距.行间距,可以在打印设计页面,右键属性里设置,然后在打印设计生成代码,也可以直接写代码.LineSpacing行间距.LetterSpacing ...
- obj.attr = 5 == obj._dict_["attr"] = 5,调用super相当于调用父类方法进行重新构造
- cxf 方法添加注解
/** * 登录 * @param uid * @param password * @return */ @POST @Path(value = "/login") public ...
- HDU-3746-KMP理解失配
这个有点意思,要理解失配数组 题意是要计算出需要构造成循环节相连的最小个数 利用失配构造函数求出单个循环节,然后计算出需要的加上的珠子个数 #include <cstdio> #inclu ...
- poj3278 【BFS】
Catch That Cow Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 97240 Accepted: 30519 ...
- MT【237】阿基米德三角形的一些常见性质
阿基米德三角形的常见性质:抛物线:$x^2=2py,AB$为抛物线的弦,$AQ,BQ$为切线,记$Q(x_0,y_0)$则$1)k_{QA}*k_{QB}=\dfrac{p}{2x_0}$$2)k_{ ...
- luogu1514 [NOIp2010]引水入城 (bfs+记忆化搜索)
我们先bfs一下看看是否能到最底下的所有点 如果不能的话,直接把不能到的那几个数一数就行了 如果能的话: 可以发现(并不可以)某格能到达的最底下的格子一定是一个连续的区间 (因为如果不连续的话,我们先 ...
- suoi63 树与路径 (倍增lca)
发现对于某一个点它向上发的一条边,它被经过的次数就是这个点子树数量*不是它子树的数量 那就维护一个前缀和,然后每次拿两个端点和它们的lca的值加一加减一减,再乘上加上的值,就是这次修改后答案的增量 ( ...
- 【uoj291】 ZJOI2017—树状数组
http://uoj.ac/problem/291 (题目链接) 题意 一个写错的树状数组有多大的概率与正常树状数组得出的答案一样. Solution 可以发现这个树状数组维护的是后缀和. 所以二维线 ...