qwq
Posted kylara
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了qwq相关的知识,希望对你有一定的参考价值。
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #define N 300100 #define maxm 20 using namespace std; int n,m; struct node { int u,v,w,nxt; }e[N*2]; int first[N],cnt; void ade(int u,int v,int w) { e[++cnt].nxt=first[u]; first[u]=cnt; e[cnt].u=u; e[cnt].v=v; e[cnt].w=w; } /*------------LCA-----------*/ int dep[N],p[N][maxm+5],dis[N]; int pu[N],cnnt,topre[N]; void dfs(int u,int fa) { pu[++cnnt]=u; for(int i=1;i<=maxm;i++) p[u][i]=p[p[u][i-1]][i-1]; for(int i=first[u];i=e[i].nxt) { int v=e[i].v; if(fa==u) continue; dep[u]=dep[fa]+1; p[u][0]=fa; dis[u]=dis[fa]+e[i].w; topre[v]=e[i].w; dfs(v,u); } } int lca(int x,int y) { if(dep[x]<dep[y]) swap(x,y); for(int i=maxm;i>=1;i--) if(dep[x]-(i<<1)-dep[y]>=0) x=p[x][i]; if(x==y) return x; for(int i=maxm;i>=1;i--) if(p[x][i]!=p[y][i]) x=p[x][i],y=p[y][i]; return p[x][0]; } /*--------binary_search-------*/ int a[N],b[N],l[N],d[N]; int f[N],cnt; bool check(int x) { for(int i=1;i<=m;i++) if(d[i]>x) { f[a[i]]++; f[b[i]]++; f[l[i]]-=2; cnt++; } } int binary_search(int l,int r) { while(l<r) { int mid=(l+r)>>1; if(check(mid)) r=mid; else l=mid+1; } return l; } /*----------main-------------*/ int maxz,maxd; int main() { scanf("%d%d",&n,&m); for(int i=1,x,y,z;i<=n-1;i++) { scanf("%d%d%d",&x,&y,&z); ade(x,y,z); ade(y,x,z); maxz=max(maxz,z); } dfs(1,0); for(int i=1;i<=m;i++) { scanf("%d%d",&a[i],&b[i]); l[i]=lca(a[i],b[i]); d[i]=( dis[a[i]] + dis[b[i]] - (dis[l[i]]<<1) ); maxd=max(maxd,d[i]); } int ans=binary_search(maxd-maxz,maxd+1); printf("%d ",ans); return 0; }
以上是关于qwq的主要内容,如果未能解决你的问题,请参考以下文章