1. 程式人生 > >HUD- 3926(簡單同構圖)

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發,還是對自己不夠自信,做出來了還是懷疑哪裡有問題。輸出上的問題要仔細