Trick or Treat on the Farm

本文探讨了一个有趣的算法问题:在万圣节,奶牛如何在限定的牛棚路径中收集糖果,直到重复到达同一隔间为止。文章详细介绍了如何使用Tarjan算法进行强连通分量分析,解决每头奶牛能访问多少隔间的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

每年,在威斯康星州,奶牛们都会穿上衣服,收集农夫约翰在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 
3 
2 
3 
输出样例
1 
2 
2 
3 

 

code

#include<stdio.h> 
#include<string.h>
#include<algorithm> 
using namespace std;
const int mxn=110000;
struct Edge {
    int to,next;
}edge[mxn];
bool ins[mxn];
int n,cnt,k,idx,top;
int ans[mxn],val[mxn],bel[mxn],next[mxn];
int stk[mxn],low[mxn],dfn[mxn],first[mxn];

void add(int from,int to) 
{
    edge[++cnt].to=to;
    edge[cnt].next=first[from];
    first[from]=cnt;
}

void Tarjan(int x) 
{
    dfn[x]=low[x]=++idx;
    stk[++top]=x;
    ins[x]=1;
    for(int i=first[x];i;i=edge[i].next) {
        int to=edge[i].to;
        if(!dfn[to]) {
            Tarjan(to);
            low[x]=min(low[x],low[to]);
        }
        else if(ins[to]) {
            low[x]=min(low[x],low[to]);
        }
    }
    if(low[x]==dfn[x]) {
        ++k;
        int curr,len=0;
        do{
            ++len;
            curr=stk[top--];
            bel[curr]=k;
            ins[curr]=0;
        }while(curr!=x);
        val[k]=len;
    }
}

void serch(int root,int x,int stp) {
    if(ans[x]!=0) ans[root]=ans[x]+stp;
     else serch(root,next[x],stp+1);
}

int main() 
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i) 
    {
        scanf("%d",&next[i]);
        add(i,next[i]);
        if(i==next[i]) ans[i]=1;
    }
    for(int i=1;i<=n;++i) if(!dfn[i]) Tarjan(i);
    for(int i=1;i<=n;++i) 
        if(val[bel[i]]!=1) ans[i]=val[bel[i]];
    for(int i=1;i<=n;++i) 
        if(!ans[i]) serch(i,next[i],1);
    for(int i=1;i<=n;++i) {
        printf("%d\n",ans[i]);
    }    
    return 0;
}

 

转载于:https://www.cnblogs.com/qseer/p/9825960.html

### Wine 使用技巧与方法 Wine 是一个开源项目,旨在让 Linux 和其他类 Unix 系统能够运行 Windows 应用程序。它通过模仿 Windows API 来实现这一目标,而无需实际安装 Windows 操作系统。以下是一些关于使用 Wine 的技巧和方法[^1]。 #### 安装应用程序 要安装 Windows 应用程序,用户可以简单地双击 `.exe` 文件,或者在终端中运行 `wine <application_name>.exe`。如果需要更高级的安装选项,可以使用 Winetricks 工具来安装依赖项和库[^2]。 ```bash winetricks vcrun2019 ``` 上述命令将安装 Visual C++ 2019 Redistributable,这是许多现代 Windows 应用程序所必需的。 #### 调整图形设置 某些应用程序可能需要特定的 DirectX 或 OpenGL 设置才能正常运行。可以通过 `winecfg` 工具调整这些设置: ```bash winecfg ``` 在 `Graphics` 标签页中,可以启用或禁用虚拟桌面,并调整分辨率和其他图形相关选项[^3]。 #### 使用前缀隔离环境 Wine 允许创建多个前缀(prefix),每个前缀相当于一个独立的 Windows 环境。这有助于隔离不同应用程序之间的冲突。创建新前缀的方法如下: ```bash WINEPREFIX=~/.new_prefix wineboot --init ``` 然后,在该前缀下运行应用程序时,需指定相同的 `WINEPREFIX` 环境变量。 #### 日志调试 如果某个应用程序无法正常运行,可以启用调试日志以获取更多信息。通过设置 `WINEDEBUG` 环境变量,可以控制输出的日志级别: ```bash WINEDEBUG=+all wine <application_name>.exe ``` 注意,生成的日志文件可能会非常大,因此建议仅在需要时启用此功能[^4]。 #### 性能优化 为了提高性能,可以禁用不必要的功能,例如字体平滑和视觉主题。同样,可以在 `winecfg` 中调整 CPU 数量和内存分配。 ```python import os # 设置 WINEDEBUG 环境变量 os.environ['WINEDEBUG'] = '+all' ``` #### 注意事项 确保系统已安装所有必要的依赖项,包括 32 位和 64 位库。此外,某些应用程序可能需要特定版本的 Wine 才能正常工作。在这种情况下,可以尝试使用 Wine Staging 版本,它通常包含更多实验性功能和支持[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值