G-登山小分队_第20届上海大学程序设计联赛夏季赛(校外同步赛) (nowcoder.com)
思路:把每个叶子结点放入vector里然后遍历vector,能往上走一层的,往上走,若走到根节点把它删掉
#include <bits/stdc++.h>
using namespace std;
const int N=1e3+10;
struct node{
int cnt,k;
}a[N];
bool cmp(node a,node b){
return a.cnt<b.cnt;
}
int f[N],s[N];
vector<node>v;
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
int x,y;
cin>>x>>y;
f[y]=x;//建立父子关系
s[x]++;//计算父亲节点的出度个数
a[x].cnt=a[y].cnt+1;//计算每个节点到根节点的距离
}
for(int i=1;i<=n;i++){
if(s[i]==0){//叶子结点的出度为0
a[i].k=i;//记录节点编号
v.push_back(a[i]);//把叶子结点放入数组里
}
}
int res=0;
map<int,int>mp;
sort(v.begin(),v.end(),cmp);//按照叶子结点到根节点的距离排序,距离短的放前面
while(v.size()){
mp.clear();
for(int i=0;i<v.size();i++){
if(mp[v[i].k]==0){
mp[v[i].k]=1;
v[i].k=f[v[i].k];
if(v[i].k==1){//走到根节点
v.erase(v.begin()+i,v.begin()+i+1);//删除根节点所在的连边
i--;
}
}
}
res++;
}
cout<<res<<endl;
return 0;
}