1. 程式人生 > >HDU 4586 Information Disturbing 二分+樹形dp

HDU 4586 Information Disturbing 二分+樹形dp

題目連結

題意

有一個樹形網路通訊,1號結點是長官,葉子節點是前線通訊士兵,其他節點為中傳遞資訊的士兵。為了打擊這個通訊網路,使其中任意一個前線士兵的通訊不能到達長官。利用一臺機器可以切斷士兵之間的通訊,破壞每對可以直接通訊的士兵都需要花費一個代價。在切斷的邊中,任意一條邊的代價不能超過機器能力上限,且代價總和不能超過機器壽命m,求出最小的機器能力上限,且滿足使用壽命的限制條件。

思路

先找出所有葉子節點,二分找出最小機器能力上限。dp找出使圖不連通的最小代價。
用dp[u] 表示 使u的子樹不連通的最小代價。

#include<cstdio>
#include<iostream>
#include<algorithm> #include<cstring> #include<vector> #include<string> #include<queue> #include<stack> #include<set> #include<map> #define ll long long using namespace std; const int INF = 1e6+10; const ll maxn = 1e3+10; struct edge { int v,w,next; }e[maxn*2
]; int head[maxn]; int tot,cnt; int leaf[maxn]; bool vis[maxn]; int dp[maxn]; int ans; void add(int u,int v,int w) { e[tot].v=v; e[tot].w=w; e[tot].next=head[u]; head[u]=tot++; } void init(int n) { memset(head,-1,sizeof(head)); memset(dp,0,sizeof(dp)); tot=cnt=ans=0; } void
find(int u,int fa) { int f=0; for(int i=head[u];i!=-1;i=e[i].next) { int v=e[i].v,w=e[i].w; if(v==fa)continue; find(v,u); f=1; } if(f==0)leaf[cnt++]=u; } void dfs(int u,int fa,int lim) { vis[u]=true; for(int i=head[u];i!=-1;i=e[i].next) { int v=e[i].v,w=e[i].w; if(v==fa)continue; if(w<=lim) { ans+=w; continue; } dfs(v,u,lim); } } bool check(int lim) { memset(vis,0,sizeof(vis)); ans=0; dfs(1,-1,lim); for(int i=0;i<cnt;i++) if(vis[leaf[i]])return false; return true; } void dfs2(int u,int fa,int lim)// dp[u] : 代表以u為根結點的子樹 使之不連通的最小代價 且滿足約束,如果不存在,如果不能使之不連通,值為INF { dp[u]=0; for(int i=head[u];i!=-1;i=e[i].next) { int v=e[i].v,w=e[i].w; if(v==fa)continue; dfs2(v,u,lim); if(w<=lim) dp[u]=dp[u]+min(dp[v],w); // u->v 這條邊能斷 else dp[u]=dp[u]+dp[v]; // u->v 這條不能斷 } if(dp[u]==0)dp[u]=INF; } int main() { int n,m,u,v,w; while(~scanf("%d%d",&n,&m)&&(n+m)) { init(n); int r=-INF; for(int i=0;i<n-1;i++) { scanf("%d%d%d",&u,&v,&w); add(u,v,w); add(v,u,w); r=max(r,w); } find(1,-1); int l=1; while(l<r) { int mid = (l+r)>>1; if(check(mid)) r=mid; else l=mid+1; } dfs2(1,-1,l); if(dp[1]>m) printf("-1\n"); else printf("%d\n",l); } }