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; }

浙公网安备 33010602011771号