题意:现按照以下步骤进行扫描。
- 按照输入的顺序扫描边。
- 如果当前扫描到的边,有一个节点已染色,另一个节点未染色,则将未染色的节点进行染色。
扫描到最后一条边后,如果发现还有没染色的节点。则重复上述扫描步骤。求次数
思路:这种题我们避免重复扫描边,那么我们一定要在bfs或者dfs上增加信息,显然这题的关键这是出现时间。所以我们从1开始dfs,如果该边比前者边出现的早,那么时间则加一。
/*keep on going and never give up*/
#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
#include<map>
using namespace std;
#define int long long
typedef pair<int, int> pii;
#define lowbit(x) x&(-x)
#define endl '\n'
#define wk is zqx ta die
int vis[200005];
int u[200006];
int v[200006];
map<pii, int> mp;
int ans = 0;
vector<int> pl[200005];
void dfs(int x, int fa, int t) {
ans = max(ans, t);
for (auto g : pl[x]) {
if (g == fa) {
continue;
}
if (mp[ {g, x}] < mp[ {x, fa}]) {
dfs(g, x, t + 1);
} else {
dfs(g, x, t);
}
}
}
signed main() {
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
mp.clear();
for (int i = 1; i <= n; i++) {
pl[i].clear();
}
for (int i = 1; i <= n - 1; i++) {
cin >> u[i] >> v[i];
pl[u[i]].push_back(v[i]);
pl[v[i]].push_back(u[i]);
mp[ {u[i], v[i]}] = i;
mp[ {v[i], u[i]}] = i;
}
mp[ {1, 0}] = 0;
ans = 0;
dfs(1, 0, 1);
cout << ans << endl;
}
return 0;
}