ACM 实验室2020.10.17天梯赛练习*3

7-9 小字辈 (25分)

自己做的一直超时,看了看别人的才想起来反过来存数据再用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;
    
    
}

7-12 深入虎穴 (25分)

没时间做了,回来做了做,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;
}

 

posted @ 2020-10-21 20:10  Leviathan_Sei  阅读(109)  评论(0)    收藏  举报