트리는 그래프의 일종임을 바탕으로 주어진 입력이 그래프인지, 트리인지 식별하는 문제입니다.
#include <iostream>
#include <vector>
using namespace std;
void DFS(int s, const vector<vector<int>>& adj, vector<bool>& visited) {
visited[s] = true;
for (auto d : adj[s])
if (!visited[d]) DFS(d, adj, visited);
}
int main() {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
int T;
cin >> T;
while (T--) {
int N, M;
cin >> N >> M;
vector<vector<int>> adj(N + 1);
for (int i = 0; i < M; ++i) {
int s, e;
cin >> s >> e;
adj[s].push_back(e);
adj[e].push_back(s);
}
vector<bool> visited(N + 1);
int dfsCount = 0;
for (int i = 1; i <= N; ++i) {
if (!visited[i]) {
DFS(i, adj, visited);
dfsCount++;
}
}
// Tree 조건에 따라 M == N - 1이고 DFS 1회에 모든 노드를 방문할 수 있어야 함.
if (M == N - 1 && dfsCount == 1) cout << "tree\n";
else cout << "graph\n";
}
}