(1)每个人只有两只手,所以每个点最多有两条边,最后不是成链就是成环
(2)判断是否同构即判断两个图生成的链,环条数即大小是否相等
(3)一开始没有排序之后比较,而是直接比较的1~n的num与tag,,好傻,反例如下图
int tag1[MX],f1[MX],num1[MX];
int find1(int x)
{
return x==f1[x]?x:f1[x]=find1(f1[x]);
}
int tag2[MX],f2[MX],num2[MX];
int find2(int x)
{
return x==f2[x]?x:f2[x]=find2(f2[x]);
}
int solve()
{
int n,m;cin>>n>>m;
rpp(i,n) f1[i]=i,num1[i]=1,tag1[i]=0;
rpp(i,m)
{
int u,v;cin>>u>>v;
int fx=find1(u),fy=find1(v);
if(fx!=fy)
{
num1[fx]+=num1[fy];
f1[fy]=fx;
}
else tag1[fx]=1;
}
int n2,m2;cin>>n2>>m2;
rpp(i,n2) f2[i]=i,num2[i]=1,tag2[i]=0;
rpp(i,m2)
{
int u,v;cin>>u>>v;
int fx=find2(u),fy=find2(v);
if(fx!=fy)
{
num2[fx]+=num2[fy];
f2[fy]=fx;
}
else tag2[fx]=1;
}
if((n!=n2)||(m!=m2)) return 0;
vector<pii>v,vv;
rpp(i,n)
{
int f1=find1(i),f2=find2(i);
v.push_back(make_pair(num1[f1],tag1[f1]));
vv.push_back(make_pair(num2[f2],tag2[f2]));
}
sort(all(v));sort(all(vv));
if(v==vv) return 1;
return 0;
}
signed main()
{
int T=1; cin>>T;
rpp(i,T)
{
if(solve()) printf("Case #%d: YES\n",i);
else printf("Case #%d: NO\n",i);
}
return 0;
}