P2680-运输计划【LCA,树上差分,二分答案】
生活随笔
收集整理的這篇文章主要介紹了
P2680-运输计划【LCA,树上差分,二分答案】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目鏈接:https://www.luogu.org/problemnew/show/P2680
題目大意
一棵帶權無根樹,給出若干條路徑。選擇一條邊使其邊權變為0,要求路徑的長度的最大值最小。
解題思路
首先最大值最小我們可以想到二分答案,現在我們二分到midmidmid了,我們如何判斷是否滿足。
我們我們發現只需要管路徑長度大于midmidmid的,假設有numnumnum條,那么我們必須找到一條邊滿足:
首先我們用LCALCALCA可以計算出每條路徑的原始長度,然后我們可以用樹上差分有多少條路徑經過一個點。
時間復雜度O(nlog?n)O(n\log n)O(nlogn)
OverOverOver
codecodecode
#include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<queue> using namespace std; const int N=300100; struct edge_node{int to,next,w; }a[N*2]; int n,m,tot,t,num,del,maxs; int ls[N],dep[N],dis[N],f[N][30]; int lca[N],dx[N],dy[N],len[N],acr[N]; queue<int> q; void addl(int x,int y,int w) {a[++tot].to=y;a[tot].next=ls[x];a[tot].w=w;ls[x]=tot; } void bfs() {t=(int)(log(n)/log(2))+1;q.push(1);dep[1]=1;while(!q.empty()){int x=q.front();q.pop();for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(dep[y]) continue;dep[y]=dep[x]+1;f[y][0]=x;dis[y]=dis[x]+a[i].w;q.push(y);}}for(int i=1;i<=t;i++)for(int j=1;j<=n;j++)f[j][i]=f[f[j][i-1]][i-1]; } int LCA(int x,int y) {if(dep[x]>dep[y]) swap(x,y);for(int i=t;i>=0;i--)if(dep[f[y][i]]>=dep[x])y=f[y][i];if(x==y) return x;for(int i=t;i>=0;i--)if(f[y][i]!=f[x][i])y=f[y][i],x=f[x][i];return f[x][0]; } void dfs(int x,int fa,int rec) {for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa) continue;dfs(y,x,i);acr[x]+=acr[y]; }if(acr[x]==num)del=max(del,a[rec].w); } int main() {freopen("testdata.in","r",stdin);scanf("%d%d",&n,&m);for(int i=1;i<n;i++){int x,y,w;scanf("%d%d%d",&x,&y,&w);addl(x,y,w);addl(y,x,w);}bfs();int l=0,r=N*1000;for(int i=1;i<=m;i++){scanf("%d%d",&dx[i],&dy[i]);lca[i]=LCA(dx[i],dy[i]);len[i]=dis[dx[i]]+dis[dy[i]]-dis[lca[i]]*2;maxs=max(maxs,len[i]);}while(l<=r){int mid=(l+r)/2;memset(acr,0,sizeof(acr));num=0;del=0;for(int i=1;i<=m;i++)if(len[i]>mid)acr[dx[i]]++,acr[dy[i]]++,acr[lca[i]]-=2,num++;dfs(1,1,0);if(maxs-del<=mid) r=mid-1;else l=mid+1;}printf("%d",l); }總結
以上是生活随笔為你收集整理的P2680-运输计划【LCA,树上差分,二分答案】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 玩地下城电脑配置清单(玩地下城电脑配置)
- 下一篇: CF7D-Palindrome Degr