40分求调
  • 板块P4886 快递员
  • 楼主junee
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/3/18 17:13
  • 上次更新2024/3/18 20:19:23
查看原帖
40分求调
757101
junee楼主2024/3/18 17:13
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e5+10;
int ans=0x3f3f3f3f;
int h[N],e[N*2],ne[N*2],w[N*2],idx;
int n,m;
int st[N];
int fs[N],dist[N];
int x[N],y[N];
int que[N];
void add(int a,int b,int c){
	e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}
int get_sz(int u,int fa){
    if(st[u])return 0;
    int sz=1;
    for(int i=h[u];~i;i=ne[i]){
        int j=e[i];
        if(j==fa)continue;
        sz+=get_sz(j,u);
    }
    return sz;
}
int get_ws(int u,int fa,int tot,int &ws){
    if(st[u])return 0;
    int sum=1,ms=0;
    for(int i=h[u];~i;i=ne[i]){
        int j=e[i];
        if(j==fa)continue;
        int t=get_ws(j,u,tot,ws);
        ms=max(ms,t);
        sum+=t;
    }
    ms=max(ms,tot-sum);
    if(ms<=tot/2)ws=u;
    return sum;
}
void get_dist(int u,int f,int rt){
	//if(st[u])return;
	fs[u]=rt;
	for(int i=h[u];~i;i=ne[i]){
		if(e[i]==f)continue;
		dist[e[i]]=dist[u]+w[i];
		get_dist(e[i],u,rt);
	}
}
void calc(int u){
	if(st[u]){
		cout<<ans<<'\n';
		exit(0);
	}
	st[u]=1;
	dist[u]=0;
	for(int i=h[u];~i;i=ne[i]){
		int j=e[i];
		dist[j]=w[i];
		get_dist(j,u,j);
	}
	int last=0,mlen=0,tt=0;
	for(int i=1;i<=m;i++){
		if(dist[x[i]]+dist[y[i]]>mlen){
			tt=1;
			que[tt]=i;
			mlen=dist[x[i]]+dist[y[i]];
		}
		else if(dist[x[i]]+dist[y[i]]==mlen){
			que[++tt]=i;
		}
	}
	ans=min(ans,mlen);
	for(int i=1;i<=tt;i++){
		if(fs[x[que[i]]]!=fs[y[que[i]]]){
			cout<<ans<<'\n';
			exit(0);
		}
		if(!last)last=fs[x[que[i]]];
		if(last!=fs[x[que[i]]]){
			cout<<ans<<'\n';
			exit(0);
		}
	}
	get_ws(u,-1,get_sz(u,-1),u);
	calc(u);
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	memset(h,-1,sizeof h);
	cin>>n>>m;
	for(int i=1;i<n;i++){
		int a,b,c;
		cin>>a>>b>>c;
		add(a,b,c),add(b,a,c);
	}
	for(int i=1;i<=m;i++){
		cin>>x[i]>>y[i];
	}
	int rt=1;
	get_ws(rt,-1,get_sz(rt,-1),rt);
	calc(rt);
	return 0;
}
2024/3/18 17:13
加载中...