蒟蒻95求助
查看原帖
蒟蒻95求助
247695
AuroraKelsey楼主2020/7/28 14:32
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=200005;
inline int read(){
	int x=0;char ch=getchar();
	while(!isdigit(ch)) ch=getchar();
	while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
	return x;
}
int n,k;
int hd[N<<1],tot;
struct edge{
	int to,nxt,w;
}e[N<<1];
inline void add(int x,int y){
	e[++tot].to=y;e[tot].w=1;e[tot].nxt=hd[x];hd[x]=tot;
}
struct node{
	int x,y;
}bian[N];
int p,d[N],f[N];
int ans,L1=0,L2=0;
void dfs(int x,int fa){
	if(ans<d[x]) ans=d[x],p=x;
	for(int i=hd[x];i;i=e[i].nxt){
		int y=e[i].to;
		if(y==fa) continue;
		d[y]=d[x]+1;
		f[y]=d[y];
		dfs(y,x);
		f[x]=max(f[x],f[y]);
	}
}
void find(int x){
	d[x]=0;
	ans=0;
	dfs(x,0);
}
int f1[N],f2[N];
void dp(int x,int fa){
	for(int i=hd[x];i;i=e[i].nxt){
		int y=e[i].to;
		if(y==fa) continue;
		dp(y,x);
		if(f1[x]<f1[y]+e[i].w){
			f2[x]=f1[x];
			f1[x]=f1[y]+e[i].w;
		}else if(f2[x]<f1[y]+e[i].w)
			f2[x]=f1[y]+e[i].w;
		L2=max(L2,f1[x]+f2[x]);
	}
}
int main(){
	n=read();k=read();
	for(int i=1,x,y;i<n;i++){
		x=read();y=read();
		bian[i].x=x;bian[i].y=y;
		add(x,y);add(y,x);
	}
	find(1);
	find(p); 
	L1=ans;
	if(k==1){
		printf("%d\n",2*n-L1-1);	
	}else{
		memset(d,0,sizeof(d));
		for(int i=1;i<n;i++){
			if(f[bian[i].x]==L1&&f[bian[i].y]==L1)
				{e[i*2].w=-1;e[i*2-1].w=-1;}
		}
		dp(1,0);
		printf("%d\n",2*n-L1-L2);		
	}
	return 0;
}

第六个点和答案差1

2020/7/28 14:32
加载中...