CF690C2 Brain Network (medium) 题解

题目:CF690C2 Brain Network (medium)

生成树 - 图论 - 树 - 树的直径 - dfs - bfs

看到这题,感觉很像树的直径,只不过是在图上的(燃鹅并没有图的直径这一说法)。

题目要求的是点对之间的最短距离最长,可以比较轻松地想到最小生成树:不会改变两点之间距离,而且路径还唯一。
那么,这道题就被转化成求树的直径了

直接 bfs 或树形DP即可

#include<cstdio> 
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
const int Maxn=100000+20,inf=0x3f3f3f3f;
int f[Maxn],g[Maxn];
int n,m,ans;
vector <int> e[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 ^ 48),ch=getchar();
	return s*w;
}
int find(int x)
{
	if(f[x]==x)return x;
	return f[x]=find(f[x]);
}
void dfs(int x,int fa) // 这里求直径用的是树形DP
{
	int m1=-1,m2=-1;
	for(int i=0;i<e[x].size();++i)
	{
		int y=e[x][i];
		if(y==fa)continue;
		dfs(y,x);
		int tmp=f[y]+1;
		f[x]=max(f[x],tmp);
		if(tmp>m1)m2=m1,m1=tmp;
		else if(tmp>m2)m2=tmp;
	}
	ans=max(max(ans,m1+m2),max(m1,m2));
}
int main()
{
//	freopen("in.txt","r",stdin);
	n=read(),m=read();
	
	for(int i=1;i<=n;++i)
	f[i]=i;
	for(int i=1;i<=m;++i)
	{
		int x=read(),y=read();
		if(find(x)==find(y))continue;
		e[x].push_back(y);
		e[y].push_back(x);
		f[find(x)]=find(y);
	}
	fill(f+1,f+1+n,0);
	
	dfs(1,0);
	printf("%d\n",ans);
	
	return 0;
}
发布了75 篇原创文章 · 获赞 2 · 访问量 1790

猜你喜欢

转载自blog.csdn.net/Brian_Pan_/article/details/104261109
今日推荐