Every year in Wisconsin the cows celebrate the USA autumn holiday of Halloween by dressing up in costumes and collecting candy that Farmer John leaves in the N (1 <= N <= 100,000) stalls conveniently numbered 1..N.ios
Because the barn is not so large, FJ makes sure the cows extend their fun by specifying a traversal route the cows must follow. To implement this scheme for traveling back and forth through the barn, FJ has posted a 'next stall number' next_i (1 <= next_i <= N) on stall i that tells the cows which stall to visit next; the cows thus might travel the length of the barn many times in order to collect their candy.c++
FJ mandates that cow i should start collecting candy at stall i. A cow stops her candy collection if she arrives back at any stall she has already visited.post
Calculate the number of unique stalls each cow visits before being forced to stop her candy collection.this
POINTS: 100spa
每一年万圣节,威斯康星的奶牛们都要打扮一番,出门在农场的N个牛棚里转 悠,来采集糖果.她们每走到一个不曾通过的牛棚,就会采集这个棚里的1颗糖果.code
农场不大,因此约翰要想尽法子让奶牛们获得快乐.他给每个牛棚设置了一个“后继牛 棚”.牛棚i的后继牛棚是next_i 他告诉奶牛们,她们到了一个牛棚以后,只要再日后继牛棚走去, 就能够搜集到不少糖果.事实上这是一种有点欺骗意味的手段,来节约他的糖果.blog
第i只奶牛从牛棚i开始她的旅程.请你计算,每一只奶牛能够采集到多少糖果.排序
* Line 1: A single integer: Nci
* Lines 2..N+1: Line i+1 contains a single integer: next_iit
输出格式:* Lines 1..N: Line i contains a single integer that is the total number of unique stalls visited by cow i before she returns to a stall she has previously visited.
4
1
3
2
3
1
2
2
3
Four stalls.
* Stall 1 directs the cow back to stall 1.
* Stall 2 directs the cow to stall 3
* Stall 3 directs the cow to stall 2
* Stall 4 directs the cow to stall 3
Cow 1: Start at 1, next is 1. Total stalls visited: 1.
Cow 2: Start at 2, next is 3, next is 2. Total stalls visited: 2. Cow 3: Start at 3, next is 2, next is 3. Total stalls visited: 2. Cow 4: Start at 4, next is 3, next is 2, next is 3. Total stalls visited: 3.
Solution:
本题先拓扑排序,将图分为链和环两种状况,套上记忆化的思想用$f[i]$表示$i$能获得的值,分别处理一下链的状况和环的状况,注意一些细节就$OK$了。
代码:
#include<bits/stdc++.h> #define il inline #define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++) #define Max(a,b) (a)>(b)?(a):(b) using namespace std; const int N=1e5+7; int n,f[N],to[N],rd[N],a[N],cnt; bool vis[N],p,c,vv[N]; il void topsort(int x){ vis[x]=1; rd[to[x]]--; if(!rd[to[x]])topsort(to[x]); } il int dfs(int now,int s){ f[now]=s; if(f[to[now]])return s; return f[now]=dfs(to[now],s+1); } il int qu(int now){return f[now]?f[now]:f[now]=qu(to[now])+1;} int main(){ ios::sync_with_stdio(0); cin>>n; For(i,1,n)cin>>to[i],rd[to[i]]++; For(i,1,n)if(!rd[i]&&!vis[i])topsort(i); For(i,1,n)if(rd[i]&&!f[i])dfs(i,1); For(i,1,n)if(!rd[i]&&!f[i])qu(i); For(i,1,n)cout<<f[i]<<'\n'; return 0; }