羅区[解説] P1551の親戚

最初の髪の問題の解決

オリジナルタイトルポータル

この問題は、おそらく意図している:
(a、b)はm個の所与の組に対して、例えば、1及び2親族、1と3との間の関係を3つの数字N、M、P、1の合計... N個体を、提供することです親戚は、その後、2と3も親戚です。最後に、p個の人は、いない親戚でなく、親戚や親戚の親戚にそれらを尋ねたので、この質問はタイトル知ら親戚をマージし、ばらばらのセットを使用することです。

以下のコードは、に取り付けられています。

#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<algorithm>
 //头文件
using namespace std;
int n,m,p,a,b;                     
int c,d,f[500001];
void init()
{
	for(int i=1;i<=n;i++)
	{
		f[i]=i;
	}
}
//赋值函数,先假定每个人的亲戚都是自己
int getf(int k)
{
	if(f[k]==k)
	{
		return k;
	}
	else
	{
		return getf(f[k]);
	}
}
//寻找函数,如果给定的a,b相同或者a,b有亲戚关系,那么返回出b的亲戚就是a,把a赋值给b,方便后来判断;
void merge(int x,int y)
{
	int t1=getf(x);
	int t2=getf(y);
	if(t1!=t2)
	{
		f[t2]=t1;
	}
	return;
}
//合并函数,将两个亲戚合并,相当于把b的亲戚标上了a;
int main()
{
	cin>>n>>m>>p;
	//输入
	init();
	//调用函数
	for(int i=1;i<=m;i++)
	{
		cin>>a>>b;
		merge(a,b);
	}
	//输入亲戚关系,合并亲戚关系
	for(int i=1;i<=p;i++)
	{
		cin>>c>>d;
		//输入询问亲戚
		c=getf(c);
		d=getf(d);
		依旧是调用寻找函数;
		if(c==d)
		{
			cout<<"Yes"<<endl;
		}
		//寻找函数如果两个是亲戚,数字就相同,如果相同,就输出"Yes";
		else
		{
			cout<<"No"<<endl;
		}
		//不一样就输出"No";
	}
	return 0;
}

作品によって今作品

#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<algorithm>

ヘッダファイル、学ぶC ++とCが知っている............

void init()
{
	for(int i=1;i<=n;i++)
	{
		f[i]=i;
	}
}

これは、誰もがそれは自分自身である、相対の始まりに過ぎないと仮定して、割り当ての関数である......

int getf(int k)
{
	if(f[k]==k)
	{
		return k;
	}
	else
	{
		return getf(f[k]);
	}
}

2人が同じで与えられ、その後、彼らは自分の親族であれば、親戚を見つけるための機能、それが値を返し、そうでない場合と同じ、知らない相対的ではありません、そして親戚の与えられた数を識別するために継続彼は最終的には親戚を発見し、その過程で、すべてが親戚や親戚の最終的な数は、その後、当然の親戚の数に割り当てられた最後の番号を入れた場合のために検索されるまで、それは非常に最終的な判断になりますので、発見されます便利......

void merge(int x,int y)
{
	int t1=getf(x);
	int t2=getf(y);
	if(t1!=t2)
	{
		f[t2]=t1;
	}
	return;
}

これは最高の、そして、bの値を割り当てることと同じでない場合、最終的に親戚が、それぞれの番号を見つけ、2つの数値を......理解与えられるべきで、これが同じかどうかを判断することも容易であるし、マージされません。直接出......

int main()
{
	cin>>n>>m>>p;
	init();
	for(int i=1;i<=m;i++)
	{
		cin>>a>>b;
		merge(a,b);
	}
	for(int i=1;i<=p;i++)
	{
		cin>>c>>d;
		c=getf(c);
		d=getf(d);
		if(c==d)
		{
			cout<<"Yes"<<endl;
		}
		else
		{
			cout<<"No"<<endl;
		}
	}
	return 0;
}

主な機能、%%% %%% ......それを言っていない
2場合、数、関係の相対的な数を入力します親戚の数を決定するために、次に入力親戚に割り当てられた機能を呼び出して、マージした後、判断を入力してください親戚の最終的な数は親戚が、それ以外の場合ではないこと、その後、同じです。

完璧な結末

完璧な結末

完璧な結末

おすすめ

転載: blog.csdn.net/tidongCrazy/article/details/90244884