当前位置:网站首页>强连通分量
强连通分量
2022-07-29 07:15:00 【一条小小yu】
USACO08DEC
题目描述
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 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.
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.
Calculate the number of unique stalls each cow visits before being forced to stop her candy collection.
POINTS: 100
输入格式
* Line 1: A single integer: N
* Lines 2..N+1: Line i+1 contains a single integer: next_i
输出格式
* 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.
题意翻译
题目描述
每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在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
说明/提示
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.
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int nexts[N],ans[N];
vector<int>G[N];
int n;
int sum,color[N],low[N],ins[N],dfn[N],col;
int Lemon[N];
stack<int>s;
void tarjan(int x)
{
sum++;
dfn[x]=low[x]=sum;
s.push(x);
ins[x]=1;
for(int i=0; i<G[x].size(); i++)
{
if(ins[G[x][i]]==0)
{
tarjan(G[x][i]);
low[x]=min(low[x],low[G[x][i]]);
}
else if(ins[G[x][i]]==1)
low[x]=min(low[x],dfn[G[x][i]]);
}
if(dfn[x]==low[x])
{
col++;
int node;
do
{
node=s.top();
s.pop();
color[node]=col;
ins[node]=-1;
}
while(node!=x);
}
return ;
}
void search(int root,int x,int step)
{
if(ans[x]!=0)
{
ans[root]=ans[x]+step;
return ;
}
else search(root,nexts[x],step+1);
}
int main()
{
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>nexts[i];
G[i].push_back(nexts[i]);
if(nexts[i]==i)ans[i]=1;
}
for(int i=1; i<=n; i++)
{
if(ins[i]==0)
tarjan(i);
}
for(int i=1; i<=n; i++)
{
Lemon[color[i]]++;//记录环的大小
}
for(int i=1; i<=n; i++)
if(Lemon[color[i]]!=1) ans[i]=Lemon[color[i]];//处理在环内的点
for(int i=1; i<=n; i++)
if(ans[i]==0) search(i,nexts[i],1);//处理在环外的点。
for(int i=1; i<=n; i++)
cout<<ans[i]<<endl;
return 0;
}
边栏推荐
- Nodejs installation tutorial
- PAT甲级 1146 拓扑顺序
- MySQL如何把行转换为列?
- How to establish EDI connection with Scania in Scania?
- 分析25个主要DeFi协议的路线图 预见DeFi未来的七大趋势
- 2-unified return class dto object
- Operator3 - design an operator
- 零数科技深度参与信通院隐私计算金融场景标准制定
- QT topic: basic components (button class, layout class, output class, input class, container class)
- @RequestMapping 用法详解
猜你喜欢
2-unified return class dto object
SpingBoot整合Quartz框架实现动态定时任务(支持实时增删改查任务)
MySQL如何把行转换为列?
Remote invocation of microservices
MySQL 使用客户端以及SELECT 方式查看 BLOB 类型字段内容总结
Segger's hardware anomaly analysis
对Vintage分析的一些学习理解
女研究生做“思维导图”与男友吵架!网友:吵架届的“内卷之王”....
QT基础第二天(2)qt基础部件:按钮类,布局类,输出类,输入类,容器等个别举例
Interface test actual project 03: execute test cases
随机推荐
Custom events
MySQL如何把行转换为列?
WPF interface layout must know basis
jdbc入门
5-整合swagger2
[100 cases of unity practice] the single choice multiple choice judgment questions of unity universal question answering system are all common
【OpenGL】着色器(Shader)的使用
我想问一下,我flink作业是以upsert-kafka的方式写入数据的,但是我在mysql里面去更
Clock tree synthesis (I)
SpingBoot整合Quartz框架实现动态定时任务(支持实时增删改查任务)
Description of rollingfileappender attribute in logback
梳理市面上的2大NFT定价范式和4种解决方案
Kubernetes (V) -- deploy kubernetes dashboard
Gin template
树莓派的启动流程
@RequestMapping 用法详解
【暑期每日一题】洛谷 P1601 A+B Problem(高精)
1-后台项目搭建
5-integrate swagger2
Round avatar of user list and follow small blocks