我的节目是acm615「是树吗?」
输入: 输入将包含一系列描述(测试用例),后跟一对负整数。每个测试用例将包含一系列边缘描述,后跟一对零。每个边缘描述将由一对整数组成;第一个整数标识边缘开始的节点,第二个整数标识边缘所指向的节点。节点号始终大于零。
输出: 对于每个测试用例,显示“Case k is tree”一行。或者“Case k不是树。”,其中k对应于测试用例编号(它们从1开始按顺序编号)。
示例输入
6 8 5 3 5 2 6 4
5 6 0 0
8 1 7 3 6 2 8 9 7 5
7 4 7 8 7 6 0 0
3 8 6 8 6 4
5 3 5 6 5 2 0 0
-1 -1
示例输出
Case 1 is a tree.
Case 2 is a tree.
Case 3 is not a tree.
我的代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 20001
bool
allInSameSet ( int set[], int index )
{
int setNum = 0, i = 0;
for ( i = 1 ; i <= index ; i++ )
if ( 0 != set[i] ) {
setNum = set[i];
break;
}
for ( i = 1; i <= index; i++ ) {
if ( ( setNum != set[i] ) && ( 0 != set[i]) ) {
return false;
}
}
return true;
}
void
combineSet ( int set[], int index, int par, int son)
{
for ( int i = 1; i <= index; i++)
if ( ( son == set[i] ) ) {
set[i] = par;
}
}
int
main ( int argc, char *argv[] )
{
int set[N];
int sets = 1, max = 0, caseCount = 1;
bool cycle = false;
int a = 0, b = 0;
while ( 2 == scanf ( "%d%d", &a, &b )) {
if ( (0 > a) && (0 > b) ) {
break;
}
if ( (0 == a) &&( 0 == b) ) {
if ( !cycle && allInSameSet(set, max) )
printf ( "Case %d is a tree.\n", caseCount );
else {
printf ( "Case %d is not a tree.\n", caseCount );
}
caseCount++;
cycle = false;
memset(set, 0, sizeof(set));
sets = 1;
max = 0;
a = 0;
b = 0;
}
else {
max = (max>b)?max:b;
max = (max>a)?max:a;
if ( (a == b) || ( (set[a] == set[b]) && ( ( 0 != set[a] ) && ( 0 != set[b] ) ) ) ) {
cycle = true;
}
else {
if ( ( 0 == set[a] ) && ( 0 == set[b] ) ) {
set[a] = sets;
set[b] = sets++;
}
else {
if ( 0 != set[a] && ( 0 != set[b] ) ) {
combineSet(set, max, set[a], set[b]);
}
else {
if ( 0 == set[a] )
set[a] = set[b];
else
set[b] = set[a];
}
}
}
}
}
return EXIT_SUCCESS;
}
当我尝试发送给UVA在线评判时,它总是向我返回运行时错误。 在我的机器上,它可以得到正确的答案。我的环境是ubuntu 11.10 64位 我的gcc版本是4.6.1。
问题是什么?