voidreadGraph() { while (!(!u && !v)) { G[u].push_back(v); inDegree[u] += 0; ++inDegree[v]; cin >> u >> v; } }
// 如果有環則回傳 false booldfs(int u) { visited.insert(u); for (auto& v : G[u]) { if (visited.count(v)) returnfalse; // 有環 if (!dfs(v)) returnfalse; } returntrue; }
boolsolve() { // 沒有節點也是樹 if (inDegree.empty()) returntrue;
for (auto& [u, deg] : inDegree) { if (deg) continue; if (!dfs(u)) returnfalse; break; }
// 檢查是否有節點還沒有遍歷過 for (auto& [u, _] : inDegree) if (!visited.count(u)) returnfalse; returntrue; }
intmain() { int Case = 0; while (cin >> u >> v && !(u == -1 && v == -1)) { init(); readGraph(); cout << "Case " << ++Case << " is "; if (solve()) cout << "a tree.\n"; elsecout << "not a tree.\n"; } }