hdu4756 Install Air Conditioning(MST + 树形DP)

原创 2013年09月26日 09:12:42

题目请戳这里

题目大意:给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



第一本介绍Eclipse的书——Eclipse in Action

世上第一本详细介绍Eclipse的书。如果问我的意见,我会说这本书比《JBuilder实用技术手册》更有意义,因为我喜欢Eclipse胜于JBuilder。Manning Publications h...
  • gigix
  • gigix
  • 2003-06-10 11:11:00
  • 2053

hdu4756 Install Air Conditioning

次小生成树的变形 dfs得到最佳替代边 假设两个各自连通的部分分别为树A,树B 用dp[i][j]表示树A(i点所在的树) 到 树B(j点所在的树)的最近距离(此然就是最佳替代边) 注意0号节点相连的...
  • Colin_27
  • Colin_27
  • 2013-10-24 18:14:35
  • 568

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4756 题意:给n个点,现在要使这n个点连通,并且要求代价最小。现在有2个点之间不能直接连...
  • u013742332
  • u013742332
  • 2014-09-25 23:30:13
  • 498

Install Air Conditioning HDU - 4756 树形dp

参考http://blog.csdn.net/fipped/article/details/39560869题意:给n个点,现在要使这n个点连通,并且要求代价最小。现在有2个点之间不能直接连通(除了第...
  • now_ing
  • now_ing
  • 2017-09-02 20:31:30
  • 111

MST(prim)+树形dp-hdu-4756-Install Air Conditioning

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4756 题目意思: n-1个宿舍,1个供电站,n个位置每两个位置都有边相连,其中有一条边不能...
  • cc_again
  • cc_again
  • 2013-09-27 14:14:56
  • 1510

HDU 4756 Install Air Conditioning(树形dp+MST)

题目链接: HDU 4756 Install Air Conditioning 题意: 给nn个点的二维坐标,要将这nn个点连通,边权就是两点距离,其中00号节点是根,可能会破坏除根之外的任意...
  • Ramay7
  • Ramay7
  • 2016-08-18 00:25:12
  • 243

hdu 4756 Install Air Conditioning (MST+树形dp)

Install Air Conditioning Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65535/65535 K (J...
  • u010228612
  • u010228612
  • 2013-10-06 09:12:46
  • 1156

HDU - 4756 Install Air Conditioning(树形DP + 最小生成树)

题目大意:给出N个点的坐标,第0个点是发电站,其他的点都是宿舍,现在要求你求出一个最小生成树 但是有一个问题是, 不知道哪两间宿舍不可以直接相连,所以你要预估一下最小的生成树的权值是多少解题思路:求...
  • L123012013048
  • L123012013048
  • 2015-09-11 14:43:32
  • 289

hdu 4756 Install Air Conditioning

Prim + 树形dp,南京网络赛的题目。这道题和12年福州现场赛的一道题很类似(hdu 4126 Genghis Khan the Conqueror),替换最小生成树上每一条边(与 0 点相连的...
  • u010697167
  • u010697167
  • 2013-09-23 15:38:38
  • 1504

树形DP整理小结

树形DP: 在树上进行dp,树是递归的定义的,所以树形dp也是递归的求解,一般而言,dp[node]表示的是以node为根的子树能得到的最优解 一般而言,dp[node]需要从node的子结点进行状态...
  • tomorrowtodie
  • tomorrowtodie
  • 2016-08-24 15:38:21
  • 1132
收藏助手
不良信息举报
您举报文章:hdu4756 Install Air Conditioning(MST + 树形DP)
举报原因:
原因补充:

(最多只允许输入30个字)