信息传递,洛谷之提高历练地,图的遍历

前话

      图是一种非常重要的数据结构,描述对象复杂的练习。这里开始接触图的基本概念。

          掌握好了图,在比赛中就可以拿到大部分的分数。

正题

      第一题:信息传递

      这道题比较容易,有两种做法,一个是并查集,一个是深搜。

      个人认为并查集会快一些。。。

      当然暴力搜索也不能忽视,本题可以转化为一个求最小环的过程,然后每个点进去搜一遍,如果已经遍历过一遍了,那就不用理,直接输出之前记录的答案,否则就直接dfs一遍,看一下最早更新当前时间戳是什么时候。

      记录即可。

      并查集做法

      没错就是并查集,我们用f表示他的父亲,d表示当前点到祖先的点数(包括自己,不包括祖先),如果当前我的目标点和我是相连的,就可以用d[t]+d[i]+1更新min。为什么?因为如果t,i原来是相连的,现在再连一条边,相当于就成了一个环,而这个环中的点数就是d[t]+d[i]+1(祖先)。如此,注意记录father即可

#include
#include
#include

int f[200010],d[200010];
int n;
int fx,fy;
int min=2147483647;

int findpa(int x)
{
	if(f[x]!=x)
	{
		int last=f[x];
		f[x]=findpa(f[x]);
		d[x]+=d[last];
	}
	return f[x];
}

int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		f[i]=i;
	for(int i=1;i<=n;i++)
	{
		int t;
		scanf("%d",&t);
		fx=findpa(i),fy=findpa(t);
		if(fx!=fy) {d[i]=d[t]+1;f[fx]=fy;}
		else if(d[i]+d[t]+1

 

你可能感兴趣的:(信息传递,洛谷之提高历练地,图的遍历)