今天在写同构图题目的时候一直在WA,不知道错在哪里,最后问了下学弟结构体赋值的事情,才明白自己哪里错了
#include<bits/stdc++.h>
using namespace std;
const int maxN = 10005;
int N, M, n, m, root[maxN];
int FindFather(int x) { return x == root[x] ? x : (root[x] = FindFather(root[x])); }
struct group
{
//int cnt = 1, iscircle;有误,结构体不能直接赋值
int cnt, iscircle;
group(int a = 1) :cnt(a) {}
bool operator < (const group &p)const
{
return iscircle == p.iscircle ? cnt < p.cnt : iscircle < p.iscircle;
}
}ans1[maxN], ans2[maxN];
void Umerge1(int e1, int e2)
{
int u = FindFather(e1), v = FindFather(e2);
if (ans1[u].cnt > ans1[v].cnt) swap(u, v);
if (u != v)
{
root[u] = v;
ans1[v].cnt += ans1[u].cnt;
ans1[v].iscircle = 0;
}
else ans1[v].iscircle = 1;
}
void Umerge2(int e1, int e2)
{
int u = FindFather(e1), v = FindFather(e2);
if (ans2[u].cnt > ans2[v].cnt) swap(u, v);
if (u != v)
{
root[u] = v;
ans2[v].cnt += ans2[u].cnt;
ans2[v].iscircle = 0;
}
else ans2[v].iscircle = 1;
}
void init(int x)
{
for (int i = 1; i <= x; i++) root[i] = i;
}
int main()
{
int T; cin >> T;
for (int Cas = 1; Cas <= T; Cas++)
{
cin >> N >> M;
for (int i = 0; i < maxN; i++) { ans1[i] = group(); ans2[i] = group(); }
init(N);
int e1, e2;
for (int i = 1; i <= M; i++)
{
cin >> e1 >> e2;
Umerge1(e1, e2);
}
cin >> n >> m;
init(n);
for (int i = 1; i <= m; i++)
{
cin >> e1 >> e2;
Umerge2(e1, e2);
}
bool flag = true;
if (N != n) flag = false;
sort(ans1 + 1, ans1 + 1 + N);
sort(ans2 + 1, ans2 + 1 + n);
for (int i = 1; i <= N; i++)
{
if (ans1[i].cnt != ans2[i].cnt || ans1[i].iscircle != ans2[i].iscircle || !flag)
{
flag = false;
break;
}
}
printf("Case #%d: ", Cas);
printf(flag ? "YES\n" : "NO\n");
}
return 0;
}