接続の図の問題 - ばらばらセット

グラフ理論は根本的な問題がある、そしてそれは我々がこの問題を議論する必要があり、今日の接続性マップを決定する問題ではありません、私たちは絵がコンピュータで2つの表現、1つの隣接行列を持つことができることを知っている2隣接行列表現は、我々が議論し、最小スパニングツリーの問題を導入しているテーブルに隣接しており、今日は教室で隣接リストグラフで表さ接続の問題を議論する必要があります。互いに素セット法の要件を解決するために。

入力

本问题有多组测试数据,每组测试数据有两部分,第一部分只有一行,是两个正整数,分别表示图的节点数N(节点
编号从1到N,1<=N<=100)和图的边数E;第二部分共有E行,每行也是两个整数N1,N2(1<=N1,N2<=N),分
别表示N1和N2之间有一条边。

出力

对于每一组测试数据,输出只有一行,如果是连通图,那么输出“Yes”,否则输出“No”。

サンプル入力

6 10
1 2
1 3
1 4
1 5
1 6
2 3
2 4
3 4
3 5
3 6
4 3
1 2
1 3
2 3

サンプル出力

Yes
No
#include<bits/stdc++.h>
using namespace std;
const int MAXN=100005;
int fa[MAXN],tot,n,m,u,v;
int findf(int x)
{
    return x==fa[x]?x:fa[x]=findf(fa[x]);
}
void unions(int x,int y)
{
    if(findf(x)!=findf(y))
    fa[findf(x)]=findf(y);
}
int main()
{
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        for(int i=1;i<=n;++i)
        {
            fa[i]=i;
        }
        for(int i=1;i<=m;++i)
        {
            scanf("%d %d",&u,&v);
            unions(u,v);
        }
        bool f=true;
        for(int i=1;i<=n;++i)
        {
            if(findf(i)!=findf(1))f=false;
        }
        printf("%s\n",f?"Yes":"No");
    }
    return 0;
}
#include<bits/stdc++.h>
using namespace std;
int n,m;vector<int>vec[1000];
int pre[1000];int vis[1000];
int count1;
int find(int x)
{
	int r=x;
	while(pre[r]!=r)
	r=pre[r];
	return r;
}
void mix(int x,int y)
{
	int fx=find(x);int fy=find(y);
	if(fx!=fy)
	{
		if(fx<fy)
		pre[fx]=fy;
		else
		pre[fy]=fx;
	}	
}
int main()
{
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		for(int i=1;i<=n;i++)
		pre[i]=i;
		while(m--)
		{
			int x,y;
			cin>>x>>y;
			mix(x,y);
		}
		memset(vis,0,sizeof(vis));
	    for(int i=1;i<=n;i++)
	    {
	    	vis[i]=find(i);
		}
	   bool flag=true;
	   for(int i=1;i<=n;i++)
	   {
	   	if(vis[i]!=vis[1])
	   	flag=false;
	   }	   
	     if(flag)
	     cout<<"Yes"<<endl;
	     else
	     cout<<"No"<<endl;
	}	
	return 0;
}

おすすめ

転載: blog.csdn.net/weixin_44061561/article/details/94449271