并查集求圈的个数,bfs求最大距离
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#pragma warning(disable:4996)
using namespace std;
const int inf = 0x3f3f3f3f;
int P[1005];//祖先
int findroot(int x) { return x == P[x] ? x : P[x] = findroot(P[x]); }
int ans1, ans2,f,aa;
vector<int> G[1005];
queue<int> q[2];
int main() {
int N,k,x,a,b;
scanf("%d", &N);
for (int i = 1; i <= N; ++i)P[i] = i;
for (int i = 1; i <= N; ++i) {
scanf("%d", &k);
while (k--) {
scanf("%d", &x); G[i].push_back(x); G[x].push_back(i);
a = findroot(i);
b = findroot(x);
if (a != b) P[max(a, b)] = min(a, b);
}
}
for (int k = 1; k <= N; ++k) {
int vis[1005] = {}; aa = -2;
q[f].push(k); vis[k] = 1;
while (!q[f].empty()) {
++aa;
while (!q[f].empty()) {
x = q[f].front(); q[f].pop();
for (auto y : G[x])
if (!vis[y])
vis[y] = 1, q[1 ^ f].push(y);
}
f ^= 1;
}
ans2 = max(ans2, aa);
}
for (int i = 1; i <= N; ++i)
if (P[i] == i) {
++ans1;
}
printf("%d %d\n", ans1, ans2);
}