ACM 615是一棵树?

时间:2012-06-26 07:50:32

标签: c++

我的节目是acm615「是树吗?」

输入:         输入将包含一系列描述(测试用例),后跟一对负整数。每个测试用例将包含一系列边缘描述,后跟一对零。每个边缘描述将由一对整数组成;第一个整数标识边缘开始的节点,第二个整数标识边缘所指向的节点。节点号始终大于零。

输出:         对于每个测试用例,显示“Case k is tree”一行。或者“Case k不是树。”,其中k对应于测试用例编号(它们从1开始按顺序编号)。

这里有更多detial

示例输入

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。

问题是什么?

0 个答案:

没有答案