HUD- 3926(简单同构图)

http://acm.hdu.edu.cn/showproblem.php?pid=3926

这题输出上坑了我很久:从昨天晚上6点-10点,到今天早上8-11点,近7个小时,一直在调代码,不知道错在哪里。最后对照别人的代码一行一行改成自己的代码才知道输出上有问题,先输出CASE:再输入数据,这个太坑了。

AC_CODE:

#include<bits/stdc++.h>
#define N 10010
using namespace std;
int Father[N], isCircle[N];
struct Group {
    int num;
    int isCircle;
    bool operator <(const Group&p)const{
        return isCircle == p.isCircle ? num < p.num : isCircle < p.isCircle;
    }
}ans1[N], ans2[N];
int cnt1, cnt2;
void init() {
    memset(isCircle, 0, sizeof(isCircle));
    memset(Father, -1, sizeof(Father));
}
int FindFather(int x) {
    return Father[x] <0 ? x : FindFather(Father[x]);
}
void Union(int x, int y) {
    int Fx = FindFather(x), Fy = FindFather(y);
    if (Fx != Fy) {
        Father[Fy] += Father[Fx];
        Father[Fx] = Fy;
    }
    else  isCircle[Fy] = 1;
}

bool Judge() {
    if (cnt1 != cnt2)return false;
    sort(ans1, ans1 + cnt1);
    sort(ans2, ans2 + cnt2);
    for (int i = 0; i < cnt1; ++i) {
        if (ans1[i].num != ans2[i].num||ans1[i].isCircle != ans2[i].isCircle)return false;
    }
    return true;
}

int main() {
    int T, n,m ,cas = 1;
    cin >> T;
	while (T--) {
		cout << "Case #" << cas++ << ": ";
		cin >> n >> m;
		init();
		int u, v;
		for (int i = 0; i < m; ++i) {
			cin >> u >> v;
			Union(u, v);
		}
		cnt1 = 0;
		for (int i = 1; i <= n; ++i){
			if (Father[i] < -1) {
				ans1[cnt1].num = -Father[i];
				ans1[cnt1++].isCircle = isCircle[i];
			}
		}
        init();
        cin >> n >> m;
        for (int i = 0; i < m; ++i) {
            cin >> u >> v;
            Union(u, v);
        }
		cnt2 = 0;
		for (int i = 1; i <= n; ++i){
			if (Father[i] < -1){
				ans2[cnt2].num = -Father[i];
				ans2[cnt2++].isCircle = isCircle[i];
			}
		}
        Judge()?puts("YES"):puts("NO");

    }
    return 0;
}

交了47发,还是对自己不够自信,做出来了还是怀疑哪里有问题。输出上的问题要仔细

猜你喜欢

转载自blog.csdn.net/qq_31741481/article/details/83927934
HUD