本文主要是介绍登山小分队,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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){//叶子结点的出度为0a[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;
}
这篇关于登山小分队的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!