萌新求助
查看原帖
萌新求助
152980
Euclid楼主2021/11/28 17:04

WA on #11

#include<bits/stdc++.h>

using namespace std;

const int maxn = 2e5 + 5;

int n,m,s,t,s1,s2,t1,t2;
int depth[maxn];
bool flag,vis[maxn],vis_[maxn];

inline int read()
{
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=(s<<3) + (s<<1) +ch-'0',ch=getchar();
   return s*w;
}

struct sm
{
	int v,next;
}a[maxn * 2];

int head[maxn],cnt;

void add(int u,int v)
{
	a[++cnt].v = v;
	a[cnt].next = head[u];
	head[u] = cnt;
}

void dfs(int u,int fa)
{
	int son = 0;
	depth[u] = depth[fa] + 1;
	for(int i = head[u];i;i = a[i].next)
	{
		int v = a[i].v;
		if(v==fa)continue;
		dfs(v,u);
		son++;
	}
	if(son >= 2 && depth[u] > depth[s] && !flag)s = u;
	if(son >= 2 && depth[u] > depth[t] && flag)t = u;
}

void dfs_first(int u,int fa)
{
	for(int i = head[u];i;i = a[i].next)
	{
		int v = a[i].v;
		if(v==fa)continue;
		dfs_first(v,u);
		vis[u] = vis[u]|vis[v];
	}
}

void dfs_second(int u,int fa)
{
	depth[u] = depth[fa] + 1;
	if(depth[u] > depth[s1] && flag)s1 = u;
	if(depth[u] > depth[t1] && !flag)t1 = u;
	for(int i = head[u];i;i = a[i].next)
	{
		int v = a[i].v;
		if(v==fa||vis[v]||vis_[v])continue;
		dfs_second(v,u);
	}
}

void dfs_third(int u,int fa)
{
	for(int i = head[u];i;i = a[i].next)
	{
		int v = a[i].v;
		if(v==fa)continue;
		dfs_third(v,u);
		vis_[u] = vis_[u]|vis_[v];
	}
}

void pre()
{
	dfs(n,0);flag = 1;
	//printf("\n");
	dfs(s,0);//找公共部分 
	
	
	vis[t] = 1;
	dfs_first(s,0);//标记公共部分 
	
	flag = 1;
	dfs_second(s,0);//从s开始找第一条长链
		
	vis_[s1] = 1;
	dfs_third(s,0);//标记从开始s的第一条长链
	
	flag = 0;
	dfs_second(t,0);//从t开始找第一条长链
	
	vis_[t1] = 1;
	dfs_third(t,0);//标记从t开始的第一条长链 
	
	printf("%d %d\n",s1,t1);
	
	s1 = 0,t1 = 0;
	
	flag = 1;
	dfs_second(s,0);
	
	flag = 0;
	dfs_second(t,0);
	printf("%d %d",s1,t1);
}

signed main()
{
	n = read();
	int x,y;
	for(int i = 1;i < n;i++)
	{
		x = read(),y = read();
		add(x,y);
		add(y,x);
	}
	pre();
	return 0;
}

求hack数据

2021/11/28 17:04
加载中...