洛谷 P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm
題目描述
每年,在威斯康星州,奶牛們都會穿上衣服,收集農夫約翰在N(1<=N<=100,000)個牛棚隔間中留下的糖果,以此來慶祝美國秋天的萬圣節。
由于牛棚不太大,FJ通過指定奶牛必須遵循的穿越路線來確保奶牛的樂趣。為了實現這個讓奶牛在牛棚里來回穿梭的方案,FJ在第i號隔間上張貼了一個“下一個隔間”Next_i(1<=Next_i<=N),告訴奶牛要去的下一個隔間;這樣,為了收集它們的糖果,奶牛就會在牛棚里來回穿梭了。
FJ命令奶牛i應該從i號隔間開始收集糖果。如果一只奶?;氐侥骋粋€她已經去過的隔間,她就會停止收集糖果。
在被迫停止收集糖果之前,計算一下每頭奶牛要前往的隔間數(包含起點)。
輸入格式
第1行 整數n。
第2行到n+1行 每行包含一個整數 next_i 。
輸出格式
n行,第i行包含一個整數,表示第i只奶牛要前往的隔間數。
樣例解釋
有4個隔間
隔間1要求牛到隔間1
隔間2要求牛到隔間3
隔間3要求牛到隔間2
隔間4要求牛到隔間3
牛1,從1號隔間出發,總共訪問1個隔間;
牛2,從2號隔間出發,然后到三號隔間,然后到2號隔間,終止,總共訪問2個隔間;
牛3,從3號隔間出發,然后到2號隔間,然后到3號隔間,終止,總共訪問2個隔間;
牛4,從4號隔間出發,然后到3號隔間,然后到2號隔間,然后到3號隔間,終止,總共訪問3個隔間。
輸入輸出樣例
輸入樣例#1: 復制 4 1 3 2 3 輸出樣例#1: 復制 1 2 2 3本來以為是水題,被洛谷坑了2333。
如果暴力模擬可以拿40分,之后想到記憶化搜索。
記憶化搜索對于樹是非常方便的,但無法處理環,那就先tarjan縮點。
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<stack> 5 using namespace std; 6 const int N=100005; 7 int n,tim,dcnt,next[N],nxt[N],dfn[N],low[N],belong[N],sz[N],ans[N]; 8 bool instk[N],vis[N]; 9 stack<int>stk; 10 void tarjan(int u) 11 { 12 dfn[u]=low[u]=++tim; 13 instk[u]=1; 14 stk.push(u); 15 if(next[u]) 16 { 17 if(dfn[next[u]]==0) 18 { 19 tarjan(next[u]); 20 low[u]=min(low[u],low[next[u]]); 21 } 22 else if(instk[next[u]]) 23 low[u]=min(low[u],dfn[next[u]]); 24 } 25 if(low[u]==dfn[u]) 26 { 27 ++dcnt; 28 while(1) 29 { 30 int t=stk.top(); 31 stk.pop(); 32 instk[t]=0; 33 belong[t]=dcnt; 34 sz[dcnt]++; 35 if(t==u) 36 break; 37 } 38 } 39 } 40 void dfs(int u) 41 { 42 if(nxt[u]) 43 { 44 if(!vis[nxt[u]]) 45 { 46 dfs(nxt[u]); 47 vis[nxt[u]]=1; 48 } 49 ans[u]=ans[nxt[u]]+sz[u]; 50 } 51 else 52 { 53 ans[u]=sz[u]; 54 vis[u]=1; 55 } 56 } 57 int main() 58 { 59 scanf("%d",&n); 60 for(int i=1;i<=n;i++) 61 { 62 scanf("%d",&next[i]); 63 if(next[i]==i) 64 next[i]=0; 65 } 66 for(int i=1;i<=n;i++) 67 if(!dfn[i]) 68 tarjan(i); 69 for(int i=1;i<=n;i++) 70 if(next[i]&&belong[i]!=belong[next[i]]) 71 nxt[belong[i]]=belong[next[i]]; 72 for(int i=1;i<=dcnt;i++) 73 if(!vis[i]) 74 { 75 dfs(i); 76 vis[i]=1; 77 } 78 for(int i=1;i<=n;i++) 79 printf("%d\n",ans[belong[i]]); 80 return 0; 81 }
?
轉載于:https://www.cnblogs.com/fantasquex/p/9342708.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的洛谷 P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Luogu P3953 逛公园
- 下一篇: python与用户交互、数据类型