ACM 实验室2020.10.17天梯赛练习*3
自己做的一直超时,看了看别人的才想起来反过来存数据再用dfs可以减少时间的花费。
#include<iostream> #include<algorithm> #include<vector> using namespace std; int tmp; int N,mm; vector<int> v[100001],ans; vector<int>::iterator it; void dfs(int pos,int age){ int i; for(i=0;i<v[pos].size();i++) dfs(v[pos][i],age+1); if(age>tmp){ tmp=age; ans.clear(); // cout<<pos<<endl; ans.push_back(pos); } else if(age==tmp){ // cout<<pos<<endl; ans.push_back(pos); } } int main(){ int pos; cin>>N; for(int i =1;i<=N;i++){ int t; cin>>t; if(t==-1){ pos=i; v[t].push_back(i); } else v[t].push_back(i); } dfs(pos,1); cout<<tmp<<endl; sort(ans.begin(),ans.end()); cout<<*ans.begin(); for(it=ans.begin()+1;it!=ans.end();it++){ cout<<" "<<*it; } cout<<endl; }
没时间做了,回来做了做,dfs。
#include<iostream> #include<algorithm> #include<vector> using namespace std; int N,K,a[100001],ans,maxDeep; vector<int> v[100001]; void dfs(int x,int deep){ for(vector<int>::iterator it=v[x].begin();it!=v[x].end();it++){ if(*it!=0){ dfs(*it,deep+1); } } if(deep>=maxDeep){ maxDeep=deep; ans=x; } } int main(){ cin>>N; for(int i=1;i<=N;i++){ cin>>K; while(K--){ int t; cin>>t; v[i].push_back(t); a[t]=1; } } int doorPos; for(int i =1;i<=N;i++){ if(a[i]==0){ doorPos=i; break; } } dfs(doorPos,1); cout<<ans<<endl; return 0; }

浙公网安备 33010602011771号