hdu 4081 最小生成树变形
/*关于最小生成树的等效边,就是讲两个相同的集合连接在一起
先建立一个任意最小生成树,这条边分开的两个子树的节点最大的一个和为A,sum为最小生成树的权值和,B为sum-当前边的权值
不断枚举最小生成树中的边找最优值即可。
*/
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#define N 1100
struct nodee
{
int u,v;
double w;
} edge[N*N];
struct node
{
int u,v,next;
double w;
} bian[N*N];
int index,yong,head[N],visit[N],n,pre[N],flag[N],c[N],aa[N],bb[N];
double ans;
double sum;
void init()
{
index=0;
yong=0;
sum=0;
int i;
for(i=1; i<=n; i++)
pre[i]=i;
memset(head,-1,sizeof(head));
memset(flag,0,sizeof(flag));
}
int cmp(const void *a,const void *b)
{
return (*(struct nodee *)a).w>(*(struct nodee *)b).w?1:-1;
}
double distance(int u,int v)
{
return sqrt(1.0*(aa[u]-aa[v])*(aa[u]-aa[v])+(bb[u]-bb[v])*(bb[u]-bb[v])*1.0);
}
int find(int x)
{
if(pre[x]!=x)
pre[x]=find(pre[x]);
return pre[x];
}
void addedge(int u,int v,double w)
{
bian[yong].u=u;
bian[yong].v=v;
bian[yong].w=w;
bian[yong].next=head[u];
head[u]=yong++;
}
void creat()
{
int k=0,i;
for(i=0; i<index&&k<n-1; i++)
{
int u=find(edge[i].u);
int v=find(edge[i].v);
if(u!=v)
{
k++;
flag[k]=i;
sum=sum+edge[i].w;
addedge(edge[i].u,edge[i].v,edge[i].w);
addedge(edge[i].v,edge[i].u,edge[i].w);
pre[u]=v;
}
}
return ;
}
void dfs(int u)//定义全局变量好点
{
int i;
visit[u]=1;
for(i=head[u]; i!=-1; i=bian[i].next)
{
int v=bian[i].v;
if(!visit[v])
{
dfs(v);
}
}
if(ans<c[u])
ans=c[u];
}
int main()
{
int t,i,j;
double m;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
init();
for(i=1; i<=n; i++)
scanf("%d%d%d",&aa[i],&bb[i],&c[i]);
for(i=1; i<n; i++)
for(j=i+1; j<=n; j++)
{
edge[index].u=i;
edge[index].v=j;
edge[index++].w=distance(i,j);
}
qsort(edge,index,sizeof(edge[0]),cmp);
creat();
m=-1;
for(i=1; i<n; i++)
{
int e=flag[i];
memset(visit,0,sizeof(visit));
visit[edge[e].u]=1;
ans=0;
dfs(edge[e].v);
max1=ans;
memset(visit,0,sizeof(visit));
visit[edge[e].v]=1;
ans=0;
dfs(edge[e].u);
max2=ans;
if(m<1.0*(max1+max2)/(sum-edge[e].w))
m=1.0*(max1+max2)/(sum-edge[e].w);
}
printf("%.2f\n",m);
}
return 0;
}
hdu 4081 最小生成树变形的更多相关文章
- Hdu 4081 最小生成树
Qin Shi Huang's National Road System Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3 ...
- hdu 4081 最小生成树+树形dp
思路:直接先求一下最小生成树,然后用树形dp来求最优值.也就是两遍dfs. #include<iostream> #include<algorithm> #include< ...
- HDU 4786 最小生成树变形 kruscal(13成都区域赛F)
Fibonacci Tree Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- Qin Shi Huang's National Road System HDU - 4081(树形dp+最小生成树)
Qin Shi Huang's National Road System HDU - 4081 感觉这道题和hdu4756很像... 求最小生成树里面删去一边E1 再加一边E2 求该边两顶点权值和除以 ...
- HDU 1233(最小生成树)
HDU 1233(最小生成树 模板) #include <iostream> #include <algorithm> #include <cstdio> usin ...
- HDU 4081 Qin Shi Huang's National Road System 最小生成树+倍增求LCA
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4081 Qin Shi Huang's National Road System Time Limit: ...
- hdu 4081 Qin Shi Huang's National Road System(最小生成树+dp)2011 Asia Beijing Regional Contest
同样是看别人题解才明白的 题目大意—— 话说秦始皇统一六国之后,打算修路.他要用n-1条路,将n个城市连接起来,并且使这n-1条路的距离之和最短.最小生成树是不是?不对,还有呢.接着,一个自称徐福的游 ...
- HDU 4081 Qin Shi Huang's National Road System 最小生成树
分析:http://www.cnblogs.com/wally/archive/2013/02/04/2892194.html 这个题就是多一个限制,就是求包含每条边的最小生成树,这个求出原始最小生成 ...
- hdu 4081 Qin Shi Huang's National Road System (次小生成树的变形)
题目:Qin Shi Huang's National Road System Qin Shi Huang's National Road System Time Limit: 2000/1000 M ...
随机推荐
- POJ Area of Simple Polygons 扫描线
这个题lba等神犇说可以不用离散化,但是我就是要用. 题干: Description There are N, <= N <= , rectangles -D xy-plane. The ...
- openstack封装待调试
- CSS盒子居中的常用的几种方法
第一种: 用css的position属性 <style type="text/css"> .div1 { width: 100px; height: 100px; bo ...
- 哈夫曼编码译码系统(c/c++)
哈夫曼编码译码系统的实现,主要包含三部分: 1.创建哈夫曼树 2.编码函数 3.译码函数 编写代码时为了方便,在这里混用了c++的输入输出流.主体用c语言实现. 下面时代码部分: 1.头文件,以及储存 ...
- ACM_黑色星期五
黑色星期五 Time Limit: 2000/1000ms (Java/Others) Problem Description: 13号又是星期五是一个不寻常的日子吗?13号在星期五比在其他日少吗?为 ...
- Java—解压zip文件
import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import ja ...
- Linux(centOS7.2)+node+express初体验
赶着阿里云服务器老用户服务器半折的好时机,手痒买了一个低配. 想着对于低配用Linux应该比较好(无可视化界面) 于是选择安装了centOs7.2: 我是通过SecureCRT进行远程连接的(如何操作 ...
- JS——indexOf replace search
indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置 注释:indexOf() 方法对大小写敏感!如果要检索的字符串值没有出现,则该方法返回 -1. 语法:searchvalue, ...
- C# ADO.NET动态数据的增删改查(第五天)
一.插入登录框中用户输入的动态数据 /// <summary> /// 添加数据 /// </summary> /// <param name="sender& ...
- Linux Shell ssh登录脚本
Linux 登陆服务器敲命令太多,某时候确实不便,所以就用shell写了一个 我的blog地址: http://www.cnblogs.com/caoguo 一.说明 支持秘密和密钥两种格式 用户名 ...