Round #203 (Div. 2)B、Resort

1、题目链接:http://codeforces.com/contest/350/problem/B

2、去掉所有出度大于一的点,然后搜索即可。

 

#include<cstdio>
#include<cstring>
using namespace std;
int hotel[100010],fa[100010],od[100010],len,max;
int dfs(int num){
    if(fa[num]==0) return len;
    len++;
    return dfs(fa[num]);
}
void print_ans(int num){
    if(fa[num]==0){
       printf("%d\n",max);
       printf("%d",num);
       max--;
       if(max) printf(" ");
       else printf("\n");
    }
    else{
      print_ans(fa[num]);
      printf("%d",num);
      max--;
      if(max) printf(" ");
      else printf("\n");
    }
    return;
}
int main()
{
    //freopen("a.txt","r",stdin);
    int n,temp,cnt,maxi;
    while(scanf("%d",&n)==1){
        memset(od,0,sizeof(od));
        memset(fa,0,sizeof(fa));
        cnt=0;
        for(int i=1;i<=n;i++){
           scanf("%d",&temp);
           if(temp==1){
              hotel[cnt++]=i;
           }
        }
        for(int i=1;i<=n;i++){
           scanf("%d",&fa[i]);
           od[fa[i]]++;
        }
        for(int i=1;i<=n;i++){
           if(od[fa[i]]>1){
              fa[i]=0;
           }
        }
        max=-1;
        for(int i=0;i<cnt;i++){
           len=1;
           temp=dfs(hotel[i]);
           if(temp>max){
              max=temp;
              maxi=hotel[i];
           }
        }
        print_ans(maxi);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值