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发,还是对自己不够自信,做出来了还是怀疑哪里有问题。输出上的问题要仔细