题目请戳这里

题目大意:给n个点,现在要使这n个点连通,并且要求代价最小。现在有2个点之间不能直接连通(除了第一个点),求最小代价。

题目分析:跟这题一样样的,唉,又是原题。。先求mst,然后枚举边,对于生成树上的边替换,用树形dp O(N^2)求出每条生成树边的最小替代边。然后替换后的最大值。

详情请见代码:

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<cctype>
#include<map>
#include<vector>
#include<set>
#include<queue>
#include<string>
using namespace std;
const int N = 1005;
const int M = 3000005;
const int inf = 0x3f3f3f3f;
const double eps = 1e-6;
const double PI = acos(-1.0);
typedef __int64 ll;
double dis[N][N];
double dp[N][N];
bool used[N][N];
bool flag[N];
double lowcost[N];
int pre[N],head[N];
struct node
{
int x,y;
}pt[N];
struct nd
{
int to,next;
}e_mst[M];
int n,m,num;
double B;
void build(int s,int e)
{
e_mst[num].to = e;
e_mst[num].next = head[s];
head[s] = num ++;
}
double getdis(int x1,int y1,int x2,int y2)
{
return sqrt((double)(x1 - x2) * (double)(x1 - x2) + (double)(y1 - y2) * (double)(y1 - y2));
}
void prim()
{
B = 0;
int i,j;
memset(flag,false,sizeof(flag));
for(i = 1;i <= n;i ++)
{
lowcost[i] = dis[1][i];
pre[i] = 1;
}
flag[1] = true;
for(i = 1;i < n;i ++)
{
double Min = 100000000.0;
int v;
for(j = 1;j <= n;j ++)
{
if(flag[j] == false && lowcost[j] < Min)
{
Min = lowcost[j];
v = j;
}
}
B += Min;
used[pre[v]][v] = used[v][pre[v]] = true;
build(v,pre[v]);
build(pre[v],v);
flag[v] = true;
for(j = 1;j <= n;j ++)
{
if(flag[j] == false && lowcost[j] > dis[v][j])
{
lowcost[j] = dis[v][j];
pre[j] = v;
}
}
}
}
double dfs(int cur,int u,int fa)
{
double ret = inf;
for(int i = head[u];~i;i = e_mst[i].next)
{
if(e_mst[i].to == fa)
continue;
double tmp = dfs(cur,e_mst[i].to,u);
ret = min(tmp,ret);
dp[u][e_mst[i].to] = dp[e_mst[i].to][u] = min(tmp,dp[u][e_mst[i].to]);
}
if(cur != fa)
ret = min(ret,dis[cur][u]);
return ret;
}
int main()
{
int t,i,j;
scanf("%d",&t);
while(t --)
{
scanf("%d%d",&n,&m);
for(i = 1;i <= n;i ++)
scanf("%d%d",&pt[i].x,&pt[i].y);
for(i = 1;i <= n;i ++)
for(j = 1;j <= i;j ++)
{
dp[i][j] = dp[j][i] = inf;
if(i == j)
dis[i][j] = 0;
else
dis[i][j] = dis[j][i] = getdis(pt[i].x,pt[i].y,pt[j].x,pt[j].y);
}
memset(used,false,sizeof(used));
memset(head,-1,sizeof(head));
num = 0;
prim();
double ans = B;
for(i = 0;i < n;i ++)
dfs(i,i,-1);
for(i = 2;i <= n;i ++)
{
for(j = 2;j < i;j ++)
{
if(used[i][j] == true)
{
ans = max(ans,B-dis[i][j]+dp[i][j]);
}
}
}
printf("%.2lf\n",ans*m);
}
return 0;
}
//718MS 17100K

hdu4756 Install Air Conditioning(MST + 树形DP)的更多相关文章

  1. HDU 4756 Install Air Conditioning (MST+树形DP)

    题意:n-1个宿舍,1个供电站,n个位置每两个位置都有边相连,其中有一条边不能连,求n个位置连通的最小花费的最大值. 析:因为要连通,还要权值最小,所以就是MST了,然后就是改变一条边,然后去找出改变 ...

  2. Install Air Conditioning HDU - 4756(最小生成树+树形dp)

    Install Air Conditioning HDU - 4756 题意是要让n-1间宿舍和发电站相连 也就是连通嘛 最小生成树板子一套 但是还有个限制条件 就是其中有两个宿舍是不能连着的 要求所 ...

  3. HDU 4756 Install Air Conditioning(次小生成树)

    题目大意:给你n个点然后让你求出去掉一条边之后所形成的最小生成树. 比較基础的次小生成树吧. ..先prime一遍求出最小生成树.在dfs求出次小生成树. Install Air Conditioni ...

  4. hdu4126(MST + 树形dp

    题意:       这个题目和hdu4756差不多,是给你一个图,然后是q次改变边的权值,权值只增不减,最后问你每次改变之后的最小树的平均值是多少. 思路:(prim+树形dp)       先跑一边 ...

  5. hdu 4756 Install Air Conditioning

    非正规做法,一个一个的暴,减一下枝,还得采用sort,qsort居然过不了…… #include <cstdio> #include <cmath> #include < ...

  6. hdu 4756 MST+树形dp ****

    题意:给你n(n = 1000)个二维点,第一个点是power plant,还有n - 1个点是dormitories.然后现在知道有一条寝室到寝室的边是不能连的,但是我们不知道是哪条边,问这种情况下 ...

  7. hdu4126Genghis Khan the ConquerorGenghis Khan the Conqueror(MST+树形DP)

    题目请戳这里 题目大意:给n个点,m条边,每条边权值c,现在要使这n个点连通.现在已知某条边要发生突变,再给q个三元组,每个三元组(a,b,c),(a,b)表示图中可能发生突变的边,该边一定是图中的边 ...

  8. HDU 4126 Genghis Khan the Conqueror MST+树形dp

    题意: 给定n个点m条边的无向图. 以下m行给出边和边权 以下Q个询问. Q行每行给出一条边(一定是m条边中的一条) 表示改动边权. (数据保证改动后的边权比原先的边权大) 问:改动后的最小生成树的权 ...

  9. MST + 树形 dp

    Genghis Khan(成吉思汗)(1162-1227), also known by his birth name Temujin(铁木真) and temple name Taizu(元太祖), ...

随机推荐

  1. Redmine backlogs 升级

    刚装完1.0.3两天,1.0.4发布了,乘项目还没有开始,赶快升级.升级过程 1.设置环境变量: RAILS_ENV=production export RAILS_ENV 2. 获取最新代码: cd ...

  2. mybatis 与 反射

    Mybatis是个优秀的ORM框架,所以它的反射层一定不会让我们失望 图比较大,可以开新页面查看 可以看到,Mybatis对这一块抽象的比较复杂,我们可以看到有几个比较主要的部分:Reflector. ...

  3. js字符串转json

    1,eval方式解析,这是最早的解析方式了.如下: 代码如下: function strToJson(str){ var json = eval('(' + str + ')'); return js ...

  4. 迟到的tkinter---学校选课刷屏器

    今儿上午选修了一门<结构分析与程序设计>,发现是用VB编写结构力学受力图示的一门课,VB高中学过,但是基本已经忘得差不多了,今儿老师让用VB编写了一个计算器,匆忙的百度了一下后就完成了觉得 ...

  5. java比较器Comparator 使用

    PresonDemo package cn.stat.p5.person.demo; public class PresonDemo implements Comparable { private S ...

  6. servlet 具体实现

    1)servlet 具体实现 1.在GenericServlet中声明了一个ServletConfig类型的成员变量,在init(ServletConfig)方法中对其进行了初始化 2.利用servl ...

  7. spark1.3.1使用基础教程

    spark可以通过交互式命令行及编程两种方式来进行调用: 前者支持scala与python 后者支持scala.python与java 本文参考https://spark.apache.org/doc ...

  8. JSONP的客户端的具体实现

    JSONP的客户端的具体实现 1.远程调用一个js,代码如下:         <script type="text/javascript">         var ...

  9. VS2013配合EgretVS开发简单塔防游戏

    VS2013配合EgretVS开发简单塔防游戏(1) - 环境配置 VS2013配合EgretVS开发简单塔防游戏(2) – 原型设计 VS2013配合EgretVS开发简单塔防游戏(3) – 精灵动 ...

  10. CSS - 针对不同浏览器的写法

    火狐浏览器: @-moz-document url-prefix() { /*这段区域的样式代码只在firefox起作用*/ .x{ width: 100px; height: 100px; back ...