Contest Hunter Adera6C 網絡升級 樹的直徑 樹形DP

$ \rightarrow $ 戳我進CH原題

网络升级 「Adera 6」杯省选模拟赛

总时限 16 s 总内存 256 MiB
 

题目描述

Rainbow所在学校的网络中有 $ n $ 台计算机,由 $ n-1 $ 条电缆相连(即构成树形)。
其中第i条电缆连接 $ a_i、b_i $ 两台计算机,传输时间为ti。
当然,网络中任意两台计算机 $ a、b $ 传输数据所需时间就是a到b的路径上所有电缆的传输时间之和。
网络的效率关键在于传输时间最长的两台计算机之间传输数据所需要的时间,记为 $ μ $ 。
 

现在Rainbow所在的学校要对网络进行升级,升级的目标就是减小 $ μ $ 的值。
对于第i条电缆,可以花费pi的价钱把它升级为光缆,光缆依然连接 $ a_i $ 和 $ b_i $ ,不过传输时间快到可以忽略不计!
现在学校要选择一些电缆进行升级,使得升级之后μ的值减小的前提下,花费的价钱最少。
 

输入格式

第一行一个整数 $ n $ 。
 
接下来n-1行每行四个整数 $ a_i、b_i、t_i、p_i $ 。
 

输出格式

输出升级之后 $ μ $ 的值减小的前提下,花费的最少价钱。
 

样例输入1

 4
 1 2 3 3
 1 3 8 33
 1 4 3 7

样例输出1

 10

样例输入2

 4
 1 2 3 5
 2 3 5 2
 3 4 5 4

样例输出2

 2

 

数据范围与约定

对于10%的数据,$ 1 \le n \le 10 $ 。
 
对于40%的数据,$ 1 \le n \le 1000 $ 。
 
对于100% 的数据,$ 1 \le a_i,b_i \le n \le 100000,1 \le t_i,p_i \le 10000 $ ,计算机和电缆的编号均从 $ 1 $ 开始。
 

題解

  • 找到直徑中點 $ p $ ,設直徑兩端到 $ p $ 的距離分別爲 $ d_{far},d_{near} $ 。
  • 僅考慮所有可能成爲直徑的點和邊構成的樹
  • 對於 $ p $ 的子節點 $ s_1,s_2, \dots , s_k $ ,樹形動規求切斷 $ s_i $ 與子樹中所有葉子節點聯係的代價
  • 若 $ d_{far} = d_{near} $ ,則只留一個 $ s_i $ ,其餘都要切斷
  • 若 $ d_{far} > d_{near} $ ,則要麽切斷唯一的一個 $ d_{far} $ ,要麽切斷所有的 $ d_{near} $
     

代碼

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int u=100010;
int head[u],ver[2*u],Next[2*u],edge[2*u],cost[2*u],dis[u],pre[u],f[u],d[u],a[u],b[u],v[u],c[u],fa[u];
int n,tot,m,t,i,x,y,z,w,ans,ct,temp,now,cnt;

void add(int x,int y,int z,int w)
{
    ver[++tot]=y,Next[tot]=head[x],edge[tot]=z,cost[tot]=w,head[x]=tot;
}

int bfs(int s)
{
    memset(dis,-1,sizeof(dis));
    memset(v,0,sizeof(v));
    queue<int> q;
    int i,x,y;
    q.push(s); dis[s]=pre[s]=0; v[s]=1;
    while(q.size())
    {
        x=q.front(); q.pop();
        for(i=head[x];i;i=Next[i])
            if(dis[y=ver[i]]<dis[x]+edge[i]&&!v[y])
            {
                dis[y]=dis[x]+edge[i];
                v[y]=1,q.push(y),pre[y]=i;
            }
    }
    for(i=x=1;i<=n;i++) if(dis[i]>dis[x]) x=i;
    return x;
}

void center()
{
    x=bfs(1);
    y=bfs(x);
    for(i=pre[y];i;i=pre[ver[i^1]]) a[++t]=i^1;
    for(i=1;i<=t;i++)
        if(2*dis[ver[a[i]]]<dis[y]&&2*dis[ver[a[i]^1]]>=dis[y]) ct=ver[a[i]^1];
    memset(v,0,sizeof(v)); t=0;
}

void dfs(int x)
{
    v[x]=1;
    for(int i=head[x];i;i=Next[i])
        if(!v[ver[i]])
        {
            dfs(ver[i]),fa[ver[i]]=i;
            d[x]=max(d[x],d[ver[i]]+edge[i]);
        }
    v[x]=0;
}

int dp(int x)
{
    v[x]=1;
    for(int i=head[x];i;i=Next[i])
        if(!v[ver[i]]&&d[ver[i]]+edge[i]==d[x]) f[x]+=dp(ver[i]);
    v[x]=0;
    if(!f[x]) f[x]=1<<30;
    return min(f[x],cost[fa[x]]);
}

void print(int x)
{
    v[x]=1;
    if(cost[fa[x]]<f[x]) c[++cnt]=fa[x]>>1;
    else for(int i=head[x];i;i=Next[i])
        if(!v[ver[i]]&&d[ver[i]]+edge[i]==d[x]) print(ver[i]);
}

void solve()
{
    dfs(ct);
    for(i=head[ct];i;i=Next[i])
        if(d[ver[i]]+edge[i]==dis[ct]) a[++m]=ver[i];
        else if(d[ver[i]]+edge[i]==dis[y]-dis[ct]) b[++t]=ver[i];
    v[ct]=1;
    for(i=1;i<=m;i++)
    {
        now=dp(a[i]);
        ans+=now;
        if(now>temp) temp=now,x=i;
    }
    for(i=1,now=0;i<=t;i++) now+=dp(b[i]);
    if(dis[ct]!=dis[y]&&temp>now)
    {
        ans-=temp-now;
        for(i=1;i<=m;i++)
            if(i!=x) print(a[i]);
        for(i=1;i<=t;i++) print(b[i]);
    }
    else for(i=1;i<=m;i++) print(a[i]);
}

int main()
{
    cin>>n;
    for(tot=i=1;i<n;i++)
    {
        scanf("%d%d%d%d",&x,&y,&z,&w);
        add(x,y,z,w),add(y,x,z,w);
    }
    center();
    solve();
    cout<<ans<<endl;
    /*cout<<cnt<<endl;
    for(i=1;i<=cnt;i++) printf("%d ",c[i]);*/
    return 0;
}
/*
用时
60 ms
占用内存
356 KiB
*/ 

原文地址:https://www.cnblogs.com/PotremZ/p/9601107.html

时间: 2024-10-01 07:13:07

Contest Hunter Adera6C 網絡升級 樹的直徑 樹形DP的相关文章

想升級Eclipse ADT的外掛,升級加速Android模擬器,才知道過程沒那麼簡單

自從Android Studio1.0正式版推出後, 官網只有提供Android Studio的下載, 所以習慣用Eclipse ADT Bundle的人,從此也沒得下載, 這樣一來想用Eclipse開發Android, 就只能:(1)分次各別下載各種外掛, 那種情境就請到官網 https://eclipse.org/downloads/ 下載, 那種情境的流程, 我會另外寫一篇文來說明.或者:2)總不能每次有更新的版本推出時都把用的很習慣的eclipse開發環境給捨棄吧, 更何況如果已經安裝了

驅 動 的 升 級

驅 動 的 升 級 1.vi /etc/selinux/config (SElinux是Linux安全加强工具) # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: #     enforcing - SELinux security policy is enforced. #     permissive - SELinux prints

使用 NuGet 更新套件時將 jQuery 升級到 2.0.2 應該如何降級

我們在 Visual Studio 2012 裡面會使用 NuGet 管理員管理那些常用的開發函式庫,例如jQuery.Json.NET. EntityFramework.ELMAH.… 等等.各位可能也了解到,目前 jQuery 最新版為 2.0.2 版,這個最新版基本上僅支援 IE9 以上瀏覽器 ( IE8 以下不支援 ),因此大部分人應該都不會選擇安裝最新版的 jQuery,但是在使用 NuGet 安裝或更新套件的過程中,卻有可能不小心將 jQuery 套件自動升級到最新版,導致網站發生許

[ Windows 10 ]1703/1709 無法升級1803的處理方法

問題:1703或1709,多次升級1803都是失敗收場,應該如何正確升級1803,而不失敗? 1.Windwos10的版本號 2.正常的途徑是通過(更新和安全),進行升級 3.跟著 4.稍等你下載完成並升級了相關的補丁之後,Windows10會在最後的階段開始下載1803的升級包,這個是漫長的等待以及痛苦的開始. 5.重啓過後會提示正在更新(圖略) 6.回到桌面以爲已經更新成功,結果告訴我三更新失敗,唯有重復第4步-- 7.之後我也查詢過,爲什麽會失敗,原來有可能是因為你的Bios問題,然後我就

升級 Centos 6.5 的 php 版本

升級 Centos 6.5 的 php 版本 待會再看 Centos 6.5 的 php 預設是用 5.3.3 這個版本號 最近想要改用 Laravel 4.1 發現需要 5.3.7 才能用,所以我們要來升級一下 其實對 Centos 的部分來說就是換掉 yum 的資料庫 分以下步驟進行 wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm wget http://rpms.familleco

bzoj 1305: [CQOI2009]dance 二分+網絡流判定

1305: [CQOI2009]dance跳舞 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 1340  Solved: 581[Submit][Status] Description 一次舞会有n个男孩和n个女孩.每首曲子开始时,所有男孩和女孩恰好配成n对跳交谊舞.每个男孩都不会和同一个女孩跳两首(或更多)舞曲.有一些男孩女孩相互喜欢,而其他相互不喜欢(不会“单向喜欢”).每个男孩最多只愿意和k个不喜欢的女孩跳舞,而每个女孩也最多只愿意和k个不喜

(转)OS X 升級後 MacPorts 重新安裝筆記

原地址:http://blog.lyhdev.com/2012/07/os-x-macports.html Mac OS X 10.8 Mountain Lion 正式發佈,而且祭出台幣 $590 元的便宜價格,這個版本的穩定度相信也讓不少 Snow Leopard.Lion 使用者心動. 升級 OS X 之後,MacPorts(開發者必備)也需要升級. 不幸的是,MacPorts 並沒有無痛升級方式. MacPorts Migration 的步驟參考自:https://trac.macport

【转】Linux - udev 網絡介面卡的順序

有時要設定網卡 IP 時常常會搞不清楚哪個是哪張卡.下面可以看的出來嗎??是我就不行了. 再加上之前遇到一個問題就是網絡介面卡的順序,不知道系統是怎麼偵測的,常常在開關機後順序大亂,寫信詢問 RedHat 他們建議我們可以使用 udev.來為每個裝置個別命名.其實概念很簡單先找出目前的網路卡順序. [[email protected] ~]# cat /etc/moprobe.confalias eth0 tg3alias eth1 e1000ealias eth2 e1000e 目前我的網卡分

3G網絡容量和業務承載的壓力大大增加!

在移動通信話音業務繼續保持發展的同時,對IP和高速數據業務的支持已經成為移動通信系統演進的方向.移動數據業務是推動目前移動通信技術發展的主要動力,TD-LTE作為準4G技術,以提高數據速率和頻譜利用率為中心目標,以OFDM為核心技術,採用扁平網絡結構,在20MHz信道寬度下使下行峰值速率提高到100Mbps.如何引入LTE網絡,成為運營商所關心的重點問題. 2 TD-LTE業務背景3G網絡的規模化應用推動了移動數據業務的井噴式增長,移動數據業務收入已經成為運營商業務發展的重點.與此同時,移動數據