社区讨论
求大佬赐教
灌水区参与者 2已保存回复 16
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 16 条
- 当前快照
- 1 份
- 快照标识符
- @mi86kh47
- 此快照首次捕获于
- 2025/11/21 09:27 4 个月前
- 此快照最后确认于
- 2025/11/21 09:54 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
const int M=100001;
int n,m,tot,cnt,maxn;
int head[M],size[M],fa[M],dep[M],dis[M];
int son[M],seg[M],top[M],cf[M];
struct Edge
{
int next,to,dis;
}edge[M*2];
struct Ans
{
int lca,v,x,y;
}f[M];
void add(int from,int to,int dis)
{
edge[++tot].next=head[from];
edge[tot].to=to;
edge[tot].dis=dis;
head[from]=tot;
}
void dfs1(int x)
{
size[x]=1;
for(int i=head[x];i;i=edge[i].next)
{
int y=edge[i].to;
if(y!=fa[x])
{
dis[y]=dis[x]+edge[i].dis;
fa[y]=x;
dep[y]=dep[x]+1;
dfs1(y);
size[x]+=size[y];
if(size[y]>size[son[x]]) son[x]=y;
}
}
}
void dfs2(int x,int f)
{
seg[x]=++cnt;
dep[x]=dep[fa[x]]+1;
top[x]=f;
if(son[x]) dfs2(son[x],f);
for(int i=head[x];i;i=edge[i].next)
{
int y=edge[i].to;
if(y!=son[x]&&y!=fa[x]) dfs2(y,y);
}
}
int get_lca(int x,int y)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
return x;
}
void dfs(int x,int f)
{
for(int i=head[x];i;i=edge[i].next)
{
int y=edge[i].to;
if(y!=f)
{
dfs(y,x);
cf[x]+=cf[y];
}
}
}
bool pdcf(int x,int maxx,int num,int f)
{
for(int i=head[x];i;i=edge[i].next)
{
int y=edge[i].to;
if(y!=f)
{
if(cf[y]==num&&dis[y]-dis[x]>=maxx) return true;
pdcf(y,maxx,num,x);
}
}
return false;
}
bool check(int mid)
{
int maxx=0;
int tot1=0;
memset(cf,0,sizeof(cf));
for(int i=1;i<=m;i++)
{
if(f[i].v<=mid) return true;
++cf[f[i].x];
++cf[f[i].y];
cf[f[i].lca]-=2;
maxx=max(maxx,f[i].v-mid);
tot1++;
}
if(tot1==0) return true;
dfs(1,0);
return pdcf(1,maxx,tot1,0);
}
int main()
{
cin>>n>>m;
for(int i=1;i<n;i++)
{
int x,y,z;
cin>>x>>y>>z;
add(x,y,z);
add(y,x,z);
maxn+=z;
}
dep[1]=1;
top[1]=1;
dfs1(1);
dfs2(1,1);
for(int i=1;i<=m;i++)
{
cin>>f[i].x>>f[i].y;
f[i].lca=get_lca(f[i].x,f[i].y);
f[i].v=dis[f[i].x]+dis[f[i].y]-dis[f[i].lca]*2;
}
int l=0,r=maxn;
while(l<=r)
{
int mid=(l+r)/2;
if(check(mid)) r=mid-1;
else l=mid+1;
}
cout<<l;
return 0;
}
运输计划一直5分
帮忙看一下
回复
共 16 条回复,欢迎继续交流。
正在加载回复...