题目大意与分析:先寻找根结底,然后广度优先搜索,寻找层次最大的结点。
提交代码:
#include<iostream>
#include<vector>
#include<queue>
#include<cstdio>
using namespace std;
int main(){
int n,root,door;
scanf("%d",&n);
vector<vector<int> > v(n+2);
vector<int>a(n+2,0);
for(int i=1;i<=n;i++){
int k,t;
scanf("%d",&k);
for(int j=1;j<=k;j++){
scanf("%d",&t);
v[i].push_back(t);
a[t]=1;
}
}
for(int i=1;i<=n;i++){
if(a[i]==0){
root=i;
break;
}
}
queue<int>q;
q.push(root);
door=root;
while(!q.empty()){
int t=q.front();
q.pop();
door=t;
for(int i=0;i<v[t].size();i++){
q.push(v[t][i]);
}
}
printf("%d",door);
return 0;
}
带注释代码:
#include<iostream>
#include<vector>
#include<queue>
#include<cstdio>
using namespace std;
int main(){
int n,root,door;
scanf("%d",&n);
vector<vector<int> > v(n+2);
vector<int>a(n+2,0);
for(int i=1;i<=n;i++){
int k,t;
scanf("%d",&k);
for(int j=1;j<=k;j++){
scanf("%d",&t);
v[i].push_back(t);
a[t]=1;
}
}
for(int i=1;i<=n;i++){ //寻找根结点
if(a[i]==0){
root=i;
break;
}
}
queue<int>q;
q.push(root);
door=root;
while(!q.empty()){ //BFS
int t=q.front();
q.pop();
door=t;
for(int i=0;i<v[t].size();i++){
q.push(v[t][i]);
}
}
printf("%d",door);
return 0;
}