ZOJ 3321 Crcule(そして検索集)
ZOJ 3321 Crcule(そして検索集)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3321
件名:
nノードmバーの方向図をあげます.この図はちょうど環ですか?
分析:
無方向図はシンプルなループです.条件はノードの度数=2です. 且 接続を図る
したがって、私たちは各ノードの度数を記録し、最終的な全図が1つの連結成分だけであるかどうかを確認して判断するだけでよい.
ACコード(新規):
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3321
件名:
nノードmバーの方向図をあげます.この図はちょうど環ですか?
分析:
無方向図はシンプルなループです.条件はノードの度数=2です. 且 接続を図る
したがって、私たちは各ノードの度数を記録し、最終的な全図が1つの連結成分だけであるかどうかを確認して判断するだけでよい.
ACコード(新規):
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=50+5;
int n,m;
int degree[maxn];
int fa[maxn];
int findset(int x)
{
return fa[x]==-1? x:fa[x]=findset(fa[x]);
}
int bind(int u,int v)
{
int fu=findset(u);
int fv=findset(v);
if(fu != fv)
{
fa[fu]=fv;
return 1;
}
return 0;
}
bool ok()
{
for(int i=1;i<=n;i++)
if(degree[i]!=2) return false;
for(int i=2;i<=n;i++)
if(findset(i) != findset(1)) return false;
return true;
}
int main()
{
while(scanf("%d%d",&n,&m)==2)
{
memset(fa,-1,sizeof(fa));
memset(degree,0,sizeof(degree));
while(m--)
{
int u,v;
scanf("%d%d",&u,&v);
degree[u]++;
degree[v]++;
bind(u,v);
}
printf("%s
",ok()?"YES":"NO");
}
return 0;
}
ACコード:#include<cstdio>
using namespace std;
const int maxn=100+5;
int degree[maxn];
int fa[maxn];
int findset(int x)
{
return fa[x]==-1?x:fa[x]=findset(fa[x]);
}
void bind(int i,int j)
{
int fi=findset(i);
int fj=findset(j);
if(fi!=fj)
{
fa[fi]=fj;
}
}
bool ok(int n)
{
for(int i=1;i<=n;++i)
if(degree[i]!=2) return false;
int root=fa[1]==-1?1:fa[1];
for(int i=2;i<=n;++i)
if(findset(i)!=root) return false;
return true;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)==2)
{
for(int i=1;i<=n;++i)
{
degree[i]=0;
fa[i]=-1;
}
while(m--)
{
int u,v;
scanf("%d%d",&u,&v);
++degree[u];
++degree[v];
bind(u,v);
}
printf("%s
",ok(n)?"YES":"NO");
}
return 0;
}