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