【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; }
喜欢一起简单,实用的东西,拒绝复杂花哨,我不是GEEK.