【DFS】采集糖果

读入后存储所有反向边,这些反向边一定构成一些基环外向树,每头牛可以采集到的糖果数等于基环大小加上它的深度

利用并查集可以在输入的同时求出所有环,然后DFS所有环上的所有外向树即可

 1 #include <cstdio>
 2 struct E{int next,to;}e[100001];
 3 int n,x,esz=1,csz=1,head[100001],root[100001],pre[100001],bak[100001],len[100001],ans[100001];
 4 void read(int &x)
 5 {
 6     char ch=getchar();x=0;
 7     for (;ch<‘0‘||ch>‘9‘;ch=getchar());
 8     for (;ch>=‘0‘&&ch<=‘9‘;ch=getchar()) x=x*10+ch-‘0‘;
 9 }
10 void insert(int u,int v)
11 {
12     e[esz].next=head[u];
13     head[u]=esz;
14     e[esz].to=v;
15     esz++;
16 }
17 int find(int x)
18 {
19     if (pre[x]==0) return x;
20     return pre[x]=find(pre[x]);
21 }
22 void dfs(int x,int sz)
23 {
24     ans[x]=sz;
25     for (int i=head[x];i;i=e[i].next)
26         dfs(e[i].to,sz+1);
27 }
28 int main()
29 {
30     read(n);
31     for (int i=1;i<=n;i++)
32     {
33         //x->i
34         read(x);
35         if (find(x)==i)
36         {
37             root[csz]=x;
38             csz++;
39         }
40         else
41         {
42             insert(x,i);
43             bak[i]=x;
44             pre[find(i)]=find(x);
45         }
46     }
47     for (int i=1;i<csz;i++)
48     {
49         int lj=0,sz=1,j=root[i];
50         while (j=bak[j]) sz++;
51         j=root[i];
52         do
53         {
54             ans[j]=sz;
55             for (int k=head[j];k;k=e[k].next)
56                 if (e[k].to!=lj) dfs(e[k].to,sz+1);
57             lj=j;
58         }while (j=bak[j]);
59     }
60     for (int i=1;i<=n;i++) printf("%d\n",ans[i]);
61 }
时间: 2024-07-29 13:48:12

【DFS】采集糖果的相关文章

[Usaco2008 Dec][BZOJ1589] Trick or Treat on the Farm 采集糖果

1589: [Usaco2008 Dec]Trick or Treat on the Farm 采集糖果 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 438  Solved: 244[Submit][Status][Discuss] Description 每年万圣节,威斯康星的奶牛们都要打扮一番,出门在农场的N(1≤N≤100000)个牛棚里转悠,来采集糖果.她们每走到一个未曾经过的牛棚,就会采集这个棚里的1颗糖果. 农场不大,所以约翰要想尽法子

[BZOJ1589][Usaco2008 Dec]Trick or Treat on the Farm 采集糖果

1589: [Usaco2008 Dec]Trick or Treat on the Farm 采集糖果 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 719  Solved: 408 [Submit][Status][Discuss] Description 每年万圣节,威斯康星的奶牛们都要打扮一番,出门在农场的N(1≤N≤100000)个牛棚里转悠,来采集糖果.她们每走到一个未曾经过的牛棚,就会采集这个棚里的1颗糖果. 农场不大,所以约翰要想尽

bzoj 1589: [Usaco2008 Dec]Trick or Treat on the Farm 采集糖果

Description 每年万圣节,威斯康星的奶牛们都要打扮一番,出门在农场的N(1≤N≤100000)个牛棚里转悠,来采集糖果.她们每走到一个未曾经过的牛棚,就会采集这个棚里的1颗糖果. 农场不大,所以约翰要想尽法子让奶牛们得到快乐.他给每一个牛棚设置了一个"后继牛棚".牛棚i的后继牛棚是Xi.他告诉奶牛们,她们到了一个牛棚之后,只要再往后继牛棚走去,就可以搜集到很多糖果.事实上这是一种有点欺骗意味的手段,来节约他的糖果.  第i只奶牛从牛棚i开始她的旅程.请你计算,每一只奶牛可以采

bzoj 1589: [Usaco2008 Dec]Trick or Treat on the Farm 采集糖果【tarjan+记忆化搜索】

对这个奇形怪状的图tarjan,然后重新连边把图变成DAG,然后记忆化搜索即可 #include<iostream> #include<cstdio> using namespace std; const int N=100005; int n,a[N],h[N],cnt,dfn[N],low[N],tot,s[N],top,bl[N],si[N],col,mp[N]; bool v[N]; struct qwe { int ne,to; }e[N]; int read() { i

BZOJ 1589 采集糖果

23333怎么调了一晚上.... #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxv 100500 #define maxe 100500 using namespace std; struct edge { int v,nxt; }e[maxe]; int n,xx[maxv],g[maxv],nume=0,dfn[maxv],low[

bzoj usaco 金组水题题解(1)

UPD:我真不是想骗访问量TAT..一开始没注意总长度写着写着网页崩了王仓(其实中午的时候就时常开始卡了= =)....损失了2h(幸好长一点的都单独开了一篇)....吓得赶紧分成两坨....TAT.............. —————————————————————————————————————————————————————————————————————————————— 写(被虐)了整整一个月b站上usaco的金组题...然而到现在总共只写了100道上下TAT(当然是按AC人数降序排

[USACO08DEC] Trick or Treat on the Farm

题目描述 每年万圣节,威斯康星的奶牛们都要打扮一番,出门在农场的N个牛棚里转 悠,来采集糖果.她们每走到一个未曾经过的牛棚,就会采集这个棚里的1颗糖果. 农场不大,所以约翰要想尽法子让奶牛们得到快乐.他给每一个牛棚设置了一个"后继牛 棚".牛棚i的后继牛棚是next_i 他告诉奶牛们,她们到了一个牛棚之后,只要再往后继牛棚走去, 就可以搜集到很多糖果.事实上这是一种有点欺骗意味的手段,来节约他的糖果. 第i只奶牛从牛棚i开始她的旅程.请你计算,每一只奶牛可以采集到多少糖果. 输入输出格

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

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

题目描述 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. Because the barn is not so la