题目大意:
如果一组数据
1.只有唯一的根节点
2.除根节点外的每一个点都有上级
3.图中没有环状物(看上去没有环)
那么就是一棵树,否则不是。
那么仔细想想,只要点的数目==边的数目-1 && 每个点没有两个上级
就成立。
我们可以抛弃并查集的结构,,,只需记录每个点的存在性以及上级的有无就可以判断所有。
然后是存储的方式。。
一开始写的递推。。。莫名原因错了。
果断改了数组储存每条边。。
果断AC
#include <iostream> #include <cstdio> #include <cstdlib> using namespace std; #define MAX 101 int times = 1,lines,point; int beg[MAX],end[MAX]; bool ok = true,out[MAX],poi[MAX]; int work()//判断是否是树 { if ( ( point == lines + 1 || lines < 1 ) && ok == true ) { printf("Case %d is a tree.\n",times); } else { printf("Case %d is not a tree.\n",times); } return 1; } void addp(int x)//更新点的数目 { if ( poi[x] == false ) { poi[x] = true; point++; } } int init() { while(++lines) { scanf("%d %d",&end[lines],&beg[lines]); if ( beg[lines] == 0 ) {//若读取完毕,进入下一环节 lines--; break; } else if ( beg[lines] < 0 ) {//若全部完毕,返回0结束main中的循环 return 0; } } for (int i = 1; i <= lines; i++) { addp(beg[i]); addp(end[i]); if ( out[ beg[i] ] == true ) { ok = false; break; } else { out[ beg[i] ] = true; } //更新边的起点的上级,若有一个上级就不是树 } work(); for (int i = 1; i <= lines; i++) {//全部调成初始状态 poi[beg[i]] = false; poi[end[i]] = false; out[beg[i]] = false; }//本组数据成功结束,返回1使main继续循环 return 1; } int main() { while(init()) { ok = true; lines = 0; point = 0; times++; } return 0; }