Codeforces350B

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

题意:输入数据有n个点,点和点之前双向关联,其中有一些节点是旅馆(起点),需要找到一条节点最多的链,链中每一节点没分叉。

题解:Hash记录节点链接次数,然后从每个起点开始dfs,dfs到分差节点停,直到找到最长链。

#define N 100001
#include<stdio.h>
#include<string.h>
#include<queue>
#include<stack>
#include<set>
#include<algorithm>
#include<malloc.h>
#include<math.h>
using namespace std;
int n,d[N],m[N],h[N],f[N],res[N];
int dfs(int x,int i)
{
    if(!h[x]&&m[x]<=1&&x)
    {
        f[i]=x;
        return dfs(d[x],i+1)+1;
    }
    else
        return 1;
}
int main()
{
    int i,j;
    while(scanf("%d",&n)!=EOF)
    {
        int hn=0,a,r=0,s=0;
        memset(m,0,sizeof(m));
        memset(h,0,sizeof(h));
        for(i=1;i<=n;i++)
        {
            scanf("%d",&a);
            if(a)
                h[i]=1;
        }
        for(i=1;i<=n;i++)
        {
            scanf("%d",&d[i]);
            m[d[i]]++;
        }
        for(i=1;i<=n;i++)
        {
            if(h[i])
            {
                f[0]=i;
                s=dfs(d[i],1);
                if(r<s)
                {
                    r=s;
                    for(i=0;i<s;i++)
                        res[i]=f[i];
                }
            }
        }
        printf("%d\n",r);
        printf("%d",res[r-1]);
        for(i=r-2;i>=0;i--)
            printf(" %d",res[i]);
        printf("\n");
    }
    return 0;
}

 

posted @ 2013-12-24 11:28  CrazyForAC  阅读(217)  评论(0)    收藏  举报