社区讨论

求大佬赐教

灌水区参与者 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 条回复,欢迎继续交流。

正在加载回复...