#include <iostream> #include<vector> using namespace std; int main() { //直接用树的定义,1仅有一个根 2每个结点仅被一个双亲结点指向 int m, n; int id = 1; while (cin >> m >> n) { if (m < 0) break; if(!m&&!n){cout << "Case " << id++ << " is a tree." << endl;continue;}//如果直接输入0 0 则认为它是一棵树 vector<int>v(10001, 0); vector<int>vt;//这两个数组要在while内定义 int count1 = 0, count2 = 0; while (m != 0 && n != 0) { if (!v[m]) v[m]++; if (!v[n]) v[n]++;//找到所有出现的结点,全部置为1 vt.push_back(n);//对入度进行收集,下面对他们自增 cin >> m >> n; } for (int i = 0; i < vt.size(); i++) { v[vt[i]]++;//如果满足树的定义,则整体数组元素的值是一个1 其他全部2 } for (int i = 0; i < 10001; i++) { if (v[i] == 1) count1++; if (v[i] > 2) count2++;//如果出现不止一个1,或者有元素值大于2,说明不符合定义 } if (count1 != 1 || count2) cout << "Case " << id << " is not a tree." << endl; else cout << "Case " << id << " is a tree." << endl; id++; } //如果它出现重复的边,只需要用一个集合,每次判一下边是否重复,从而决定他是否存入vt;自环的问题,count1是0,他判断结果是不是树 } // 64 位输出请用 printf("%lld")