P1894 The Perfect Stall

这篇博客介绍了如何利用匈牙利算法解决洛谷P1894题目——The Perfect Stall。内容涵盖该题目的解题思路和算法应用。

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

P1894 The Perfect Stall

https://www.luogu.com.cn/problem/P1894

这是一道较为规整的匈牙利算法:

#include <bits/stdc++.h> 
using namespace std;
const int MAX=200+10;

int n,m,ans,cow[MAX];//cow[i]代表第i个牛栏的牛
bool vis[MAX],love[MAX][MAX];//vis是已搜查过,love记录喜爱的牛栏编号

inline int read()//快读
{
	int x=0,f=1;
	char ch=getchar();
	while(!isdigit(ch))
	{
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(isdigit(ch))
	{
		x=x*10+ch-'0';
		ch=getchar();
	}
	
	return x*f; 
}

bool DFS(int x)//匈牙利算法
{
    for(int i=1;i<=m;i++)//牛栏的编号在[1,m] 
	{
        if(!vis[i]&&love[x][i])//如果这个牛栏没有搜过并且牛喜欢这个栏
		{
            vis[i]=true;//标记这头牛进入牛栏 
            if(cow[i]==0||DFS(cow[i]))//cow[i]=0,第i个牛栏没有牛,所以是可以进的||i在匹配中,但从i出发可以有增广路 
			{
                cow[i]=x;//否则把原来的牛赶出去,重新进行匹配
                return true;//有牛栏可以进,设为true
            }
        }
    }
    return false;//没有牛栏可以进。设为false
}
int main()
{
    n=read(),m=read();
    for(int i=1;i<=n;i++)
	{
        int s=read();
        while(s--)
		{
            love[i][read()]=true; 
        }
    }
    for(int i=1;i<=n;i++)
	{
        memset(vis,false,sizeof vis);//一开始所有牛栏都没有搜过
        if(DFS(i))  ans++;//如果可以进牛栏答案加一
    }
    cout<<ans<<endl;
    return 0;
}

 

04-03
### RCU Stall 的概念及其处理 RCU(Read-Copy Update)是一种用于多线程环境下的同步机制,在 Linux 内核中被广泛使用。当发生 RCU stall 时,意味着某个 CPU 或者任务长时间处于一种状态,阻止了 RCU grace period 的完成[^1]。 #### RCU Stall 的检测流程 在内核中,`rcu_sched_clock_irq()` 是触发 RCU stall 检测的一个重要函数。它通过调用一系列子函数来确认是否存在 stalled CPUs 并打印相关信息。以下是其主要路径: - `rcu_sched_clock_irq()` 调用了 `rcu_pending()` 来检查是否有未决的 RCU 工作项。 - 如果存在未决工作,则进一步调用 `check_cpu_stall()` 进行更详细的分析。 - 当发现确实存在 stalled CPUs 时,会依次调用 `print_cpu_stall()` 和其他辅助函数(如 `rcu_dump_cpu_stacks()`、`dump_cpu_task()` 等),最终生成堆栈回溯信息以便调试[^2]。 #### 处理策略 针对 RCU stall 的情况,可以通过调整内核参数来进行控制。例如,`sysctl_panic_on_rcu_stall` 参数决定了系统是否应在检测到 RCU stall 后立即崩溃并记录日志。如果该值设置为 true (`1`) ,那么一旦检测到 stall 将直接引发 kernel panic,并显示 “RCU Stall” 错误消息。 另外需要注意的是,尽管上述讨论集中在 RCU stalls 上,但在现代操作系统中有许多类似的性能瓶颈现象可以利用 Pressure Stall Information (PSI) 技术监测。PSI 提供了一种方法用来衡量由于资源竞争而导致的任务延迟程度,并且能够持续一段时间维持活跃状态以减少波动影响[^3]。 对于您提到的关于 ID 级寄存器 rs1 和 rs2 修改选项部分,这似乎涉及到了指令流水线设计中的数据前馈问题以及如何选择合适的数据源作为操作数输入给后续阶段使用的问题[^4]。不过这部分内容与前面所描述的 RCU stall 主题关联不大。 ```c // 示例代码展示如何启用 sysctl_panic_on_rcu_stall 参数 #include <linux/sysctl.h> static struct ctl_table rcu_sysctls[] = { { .procname = "panic_on_rcu_stall", .data = &sysctl_panic_on_rcu_stall, .maxlen = sizeof(int), .mode = 0644, .proc_handler = proc_dointvec_minmax, .extra1 = SYSCTL_ZERO, .extra2 = SYSCTL_ONE, }, }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值