POJ 1308 Is it a tree

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17713

题意:给定一些有向边,判断它是不是树

思路:边树edge和点数node满足edge = node-1并且没有多条边指向一个结点则为树。

遗憾的是不仅仅如此,因为空树也算树。。。。。。一样的题还有HDU1325,不过不用考虑空树情况就能过

源码:

//#include <cstdio>
//#include <cstring>
//#include <cmath>
//#include <iostream>
//using namespace std;
//int cas;
//int f,l,flag;
//int const MAXN = 100000+5000;
//int fa[MAXN];
//void init()
//{
//    for(int i=1; i<MAXN; i++)
//        fa[i] = i;
//}
//bool fi(int now,int det)
//{
//    if(fa[now]==det)
//        return true;
//    if(fa[now]==now)
//        return false;
//    return fi(fa[now],det);
//}
//bool findroot(int now)
//{
//    if(fa[now]==now)
//        return now;
//    return findroot(fa[now]);
//}
//int main()
//{
//    cas = 0;
//    init();
//    while(scanf("%d%d",&f,&l)!=EOF && f!=-1){
//        if(f==0 && l==0){
//            if(flag==0)
//                printf("Case %d is a tree.\n",++cas);
//            else
//                printf("Case %d is not a tree.\n",++cas);
//            init();
//            flag = 0;
//        }
//        else{
//            if(fa[l]==l){
//                fa[l] = f;
//                if(fi(f,l))
//                    flag = 1;
//            }
//            else if(!fi(l,f)){
//                flag = 1;
//            }
//            else{
//                fa[l] = f;
//                if(fi(f,l))
//                    flag = 1;
//            }
//        }
//    }
//    return 0;
//}
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int const MAXN = 1000000;
int mark[MAXN];
int en[MAXN];
int edge,node,een;
int f,l;
bool fi(int a,int c[],int num)
{
    for(int i=0; i<num; i++)
        if(c[i]==a)
            return true;
    return false;
}
int main()
{
    int cas = 0;
    int flag = 0;
    een = 0;
    while(scanf("%d%d", &f, &l)!=EOF && f!=-1 && l!=-1){
        if(f==0 && l==0){
//            int i;
//            for(i=0;i<node; i++)
//                printf("%d ",mark[i]);
//            printf("\n");
//            for(i=0; i<een; i++)
//                printf("%d ",en[i]);
//            printf("\n");
//            printf("flag = %d, edge = %d, node = %d\n",flag,edge,node);
            if(edge ==0 && node==0)
                printf("Case %d is a tree.\n",++cas);
            else if(edge==node-1 && !flag)
                printf("Case %d is a tree.\n",++cas);
            else
                printf("Case %d is not a tree.\n",++cas);
            edge = node = flag = een = 0;
            memset(mark,0,sizeof(mark));
        }
        else{
            if(fi(f,mark,node)==0){
                mark[node++] = f;
//                node++;
            }
            if(fi(l,mark,node)==0){
                mark[node++] = l;
            }
            if(fi(l,en,een)!=0)
                flag = 1;
            en[een++] = l;
            edge++;
        }
    }
    return 0;
}

你可能感兴趣的:(POJ 1308 Is it a tree)