【poj解题】1308

判断一个图是否是一个树,树满足一下2个条件即可:
1. 边树比node数少1
2. 所有node的入度非0即1

节点数是0的时候,空树,合法树~

代码如下

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 100

int matrix[MAX][MAX];
int node[MAX] = {0};
int N = 0;
int M = 0;

int check() {
    int i, j;
    int sum;
    if(N == 0) {
        return 1;      
    } 
    
    if(N != M + 1) {
        return 0;     
    } 

    /* 每个节点的入度非0则1 */
    for(i = 0; i < MAX; i++) {
        sum = 0;
        for(j = 0; j < MAX; j++) {
            sum += matrix[j][i]; 
        } 
        if(sum == 0 || sum == 1) {
            ;
        }
        else {
            return 0;      
       }
    }
    /* 判断图中无环 */

    return 1;
}

void print() {
    int i, j;
    for(i = 0; i < 10; i++) {
        for(j = 0; j < 10; j++) {
            printf("%d ", matrix[i][j]);     
        }     
        printf("\n");
    }    
}

int main() {
    int u,v;
    int flag = 1;
    int count = 0;
    int i;
    while(flag) {
        /* init */
        N = 0;
        M = 0;
        memset(node, 0, sizeof(node));
        memset(matrix, 0, sizeof(matrix));
        
        while(1) {
            scanf("%d%d", &u, &v);
            if(u == -1 && v == -1) {
                flag = 0;
                break;     
            }
            if(u == 0 && v == 0) {
                ;     
            }
            else {
                u --;
                v --;
                M ++;
                if(0 == node[u]) {
                    node[u] = 1;     
                    N ++;
                }
                if(0 == node[v]) {
                    node[v] = 1; 
                    N ++;
                }
                matrix[u][v] = 1;
                continue;
            }
            count ++;
            if(check()) {
                printf("Case %d is a tree.\n", count);    
            }
            else {
                printf("Case %d is not a tree.\n", count);    
            } 
            break;
        }
    }
    return 0;
}

  

posted @ 2014-01-27 13:32  ~嘉言懿行~~我是煲仔饭~~  阅读(206)  评论(0编辑  收藏  举报