1013看不懂,来1014了hhh
2次bfs找最深的深度(应该是两次?)
#include <iostream>
#include <unordered_set>
#include <queue>
#include <vector>
using namespace std;
bool m[1010][1010];
bool vis[1010];
bool secondVis[1010];
int n;
int bfs(int x,int firstBFS){
queue<int> q; // 辅助队列
vector<int> vec; // 每层有多少个
q.push(x);
vec.push_back(1);
if(firstBFS) (vis[x] = true);
else (secondVis[x] = true);
int level = 0;
int curLevelNum = 1;
int nextLevelNum = 0;
int deepest = x;
while(!q.empty()){
int u = q.front();
q.pop();
for(int i = 1;i <= n;i++){ // 遍历自己的每个邻居
if(u != i && m[u][i] == true && (firstBFS ? (!vis[i]) : (!secondVis[i]))){
q.push(i);
deepest = i;
if(firstBFS) (vis[i] = true);
else (secondVis[i] = true);
nextLevelNum++;
}
}
curLevelNum--;
if(curLevelNum == 0){
vec.push_back(nextLevelNum);
curLevelNum = nextLevelNum;
nextLevelNum = 0;
level++;
}
}
if(firstBFS) return deepest;
else return max(level - 2,0);
}
int main(){
scanf("%d",&n);
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++) m[i][j] = false;
}
for(int i = 1;i <= n;i++){
int k;
scanf("%d",&k);
for(int j = 0;j < k;j++){
int x;
scanf("%d",&x);
m[i][x] = true; m[x][i] = true;
}
}
for(int i = 1;i <= n;i++) vis[i] = false;
for(int i = 1;i <= n;i++) secondVis[i] = false;
int cnt = 0;
int largestDiameter = -1;
for(int i = 1;i <= n;i++){
if(vis[i] == false){
cnt++;
largestDiameter = max(largestDiameter,bfs(bfs(i,true),false));
}
}
printf("%d %d",cnt,largestDiameter);
system("pause");
return 0;
}