日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

洛谷 P2921 [USACO08DEC]在农场万圣节Trick or Treat on the Farm

發布時間:2023/12/20 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 洛谷 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。