Блог пользователя cmkpjjnh

Автор cmkpjjnh, история, 4 часа назад, По-английски

思路很简单,子树不同分支 没学lca,但是这题有明确主干,就是直接找公共祖先在主干上的点而且不是1 没有必要连上再减去一部分,直接全局算距离 树一般默认无向,无语,因为这个一直错 !!!没必要思考怎么连这个树,加边减边很难做,直接全局变量考虑

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=5e5+10;
vector<int>g[N];
int par[N],dep[N];
bool ok[N];
int f[N];
void dfs1(int u,int p,int d)
{
	par[u]=p;
	dep[u]=d;
	for(int v:g[u])
	{
		if(v!=p)
		{
			dfs1(v,u,d+1);
		}
	}
}
void dfs2(int u,int p)
{
	if(u!=1)
	{
		f[u]=ok[u]?u:f[p];
	}
	for(int v:g[u])
	{
		if(v!=p)
		{
			dfs2(v,u);
		}
	}
}
void solve()
{
	int n,m;cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		g[i].clear();
		par[i]=0;dep[i]=0;
		ok[i]=false;f[i]=0;
	}
	int t=n-1;
	while(t--)
	{
		int a,b;cin>>a>>b;
		g[a].push_back(b);
		g[b].push_back(a);
	}
	dfs1(1,0,0);
	for(int i=n;i!=0;i=par[i])
	{
		ok[i]=true;
	}
	f[1]=1;
	dfs2(1,0);
	int ans=dep[n];
	while(m--)
	{
		int x;cin>>x;
		if(!ok[x]&&f[x]!=1)
		{
			ans=max(ans,dep[x]+dep[n]-dep[f[x]]*2+1);
		}
	}
	cout<<ans<<'\n';
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int t;cin>>t;
	while(t--)
	{
		solve();
	}
	return 0;
}
  • Проголосовать: нравится
  • -18
  • Проголосовать: не нравится

»
4 часа назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Auto comment: topic has been updated by cmkpjjnh (previous revision, new revision, compare).

»
3 часа назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Don't speak Chinese in Codeforces. It's an unwritten rule.

»
3 часа назад, скрыть # |
← Rev. 3  
Проголосовать: нравится 0 Проголосовать: не нравится

You can save your solution elsewhere (such as the Luogu Clipboard) instead of posting it in Chinese in Codeforces.