hdu4756 Install Air Conditioning(MST + 树形DP)
题目大意:给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)的更多相关文章
- HDU 4756 Install Air Conditioning (MST+树形DP)
题意:n-1个宿舍,1个供电站,n个位置每两个位置都有边相连,其中有一条边不能连,求n个位置连通的最小花费的最大值. 析:因为要连通,还要权值最小,所以就是MST了,然后就是改变一条边,然后去找出改变 ...
- Install Air Conditioning HDU - 4756(最小生成树+树形dp)
Install Air Conditioning HDU - 4756 题意是要让n-1间宿舍和发电站相连 也就是连通嘛 最小生成树板子一套 但是还有个限制条件 就是其中有两个宿舍是不能连着的 要求所 ...
- HDU 4756 Install Air Conditioning(次小生成树)
题目大意:给你n个点然后让你求出去掉一条边之后所形成的最小生成树. 比較基础的次小生成树吧. ..先prime一遍求出最小生成树.在dfs求出次小生成树. Install Air Conditioni ...
- hdu4126(MST + 树形dp
题意: 这个题目和hdu4756差不多,是给你一个图,然后是q次改变边的权值,权值只增不减,最后问你每次改变之后的最小树的平均值是多少. 思路:(prim+树形dp) 先跑一边 ...
- hdu 4756 Install Air Conditioning
非正规做法,一个一个的暴,减一下枝,还得采用sort,qsort居然过不了…… #include <cstdio> #include <cmath> #include < ...
- hdu 4756 MST+树形dp ****
题意:给你n(n = 1000)个二维点,第一个点是power plant,还有n - 1个点是dormitories.然后现在知道有一条寝室到寝室的边是不能连的,但是我们不知道是哪条边,问这种情况下 ...
- hdu4126Genghis Khan the ConquerorGenghis Khan the Conqueror(MST+树形DP)
题目请戳这里 题目大意:给n个点,m条边,每条边权值c,现在要使这n个点连通.现在已知某条边要发生突变,再给q个三元组,每个三元组(a,b,c),(a,b)表示图中可能发生突变的边,该边一定是图中的边 ...
- HDU 4126 Genghis Khan the Conqueror MST+树形dp
题意: 给定n个点m条边的无向图. 以下m行给出边和边权 以下Q个询问. Q行每行给出一条边(一定是m条边中的一条) 表示改动边权. (数据保证改动后的边权比原先的边权大) 问:改动后的最小生成树的权 ...
- MST + 树形 dp
Genghis Khan(成吉思汗)(1162-1227), also known by his birth name Temujin(铁木真) and temple name Taizu(元太祖), ...
随机推荐
- 福昕阅读器drm加密解密总结
drm是数字版权保护的一种方式,前一段时间在做四川文轩数字图书馆项目的时候用到了相关的知识,感觉这东西对于一些在线阅读和视频播放还是有很大用处的. 对于其工作原理我也很好奇,先摘抄度娘的内容如下,当然 ...
- Dialog( 对话框) 组件
一. 加载方式//class 加载方式<div class="easyui-dialog" title="My Dialog"style="wi ...
- for-of循环
/* 1. 遍历数组 2. 遍历Set 3. 遍历Map 4. 遍历字符串 5. 遍历伪数组 6. 可迭代的对象 */var arr = [2,3,4];for(let ele of arr) { c ...
- lvm拉伸逻辑卷分区小总结
文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/vg_znl-lv_root ...
- c - 对数组进行排序(通过指针的指针)
通过指针的指针,以及一个指针数组,对实际数组元素进行排序,有一个优点,就是排序过程交换的只有指针数组中的值,而不是实际的数组的元素.当实际元素中的对象很大,特别是结构体等类型时,这样做是很有好处. 下 ...
- ArcGIS Server Manager登陆不了
我很是郁闷,安装都好了(post安装完成之后它要我将 相关的用户(我在这里安装的时候已指定) 添加到 agsadmin和agsusers两个用户组中.都做好了, 我甚至将刚刚的用户和用户组都删掉,重新 ...
- uva 10370 - Above Average
#include <iostream> #include <cstdio> using namespace std; int main() { unsigned C, N, t ...
- 《javascript设计模式》--接口
关于javascript设计模式书中的接口,记录如下 //TODO 增加了一个判断条件,可以只在生产环境中调用 接口var Interface = function(name,methods){ i ...
- angularjs——module
1.创建module //第一个参数是模块的名称 var head=angular.module('headApp',[]); head.controller("User",[&q ...
- Javascript计算密码的强度
用Javascript评估用户输入密码的强度 1.如果密码少于5位,那么就认为这是一个弱密码.2.如果密码只由数字.小写字母.大写字母或其它特殊符号当中的一种组成,则认为这是一个弱密码.3.如果密码由 ...