1947Rebuilding Roads

本文介绍了一种使用01背包解决的问题,即在给定的树中找到包含特定节点数的子树,并计算最少需要删除的边数来将其孤立。通过状态转移方程dp[root][j]记录以root为根的、节点数为j的子树的孤立情况,代码实现了从每个节点出发的递归遍历,并应用了动态规划思想。最终输出最少需要删除的边数。

大神的题解

题意:给一个包含n个节点的树,然后让你找一颗节点数为p的子树,同时让你删掉最少数目的边把这个子树给孤立起来,问这个最少的边数。

思路:很容易想到要用到01背包,要把子树的情况进行背包。用dp[root][j]记录 以root为根的、节点数为j的子树的孤立起来需要删除的最少的边数。

状态方程为:dp[root][p]=min(dp[root][p],  dp[u][k]+dp[root][p-k]-2);(其中u为root的一个孩子)

由于u与root之间的边连接了起来,所以dp[u][k]+dp[root][p-k] 多加了2次他们之间的边,所以要减去2;

含义是:我们把以 root 为根的节点的子树,把每一个分支作为背包的物品,决策就是每一个分支的选与不选,
而对于每一个分支的状态其实就是该问题的一个子问题,然后这样分割成 2 块后,我们会发现多砍了该节点与子节点的边两次,要减去之;
代码:
# include<stdio.h>
# include<string.h>
# define N 155 
int n,p;
struct node{
    int from,to,next;
}edge[2*N];
int head[N],tol,ans[N],dp[N][N];
void add(int a,int b)
{
    edge[tol].from=a;edge[tol].to=b;edge[tol].next=head[a];head[a]=tol++;
}
int min(int a,int b)
{
    return a<b?a:b;
}
void dfs(int root,int father)
{
    int i,j,k,u;
    for(i=head[root];i!=-1;i=edge[i].next)
    {
        u=edge[i].to;
        if(u!=father) dfs(u,root);
    }
    for(i=head[root];i!=-1;i=edge[i].next)
    {
        u=edge[i].to;
        if(u==father) continue;
        for(j=p;j>1;j--)
        {
            for(k=1;k<j;k++)
                dp[root][j]=min(dp[root][j],dp[u][k]+dp[root][j-k]-2);//子树和父亲节点之间的边多加了两次,所以要减去
        }
    }
}
int main()
{
    int i,j,a,b,Min;
    while(scanf("%d%d",&n,&p)!=EOF)
    {
    memset(head,-1,sizeof(head));
    memset(ans,0,sizeof(ans));
    tol=0;
    for(i=1;i<n;i++)
    {
        scanf("%d%d",&a,&b);
        add(a,b);
        add(b,a);
        ans[a]++;
        ans[b]++;
    }
    for(i=1;i<=n;i++)
        for(j=1;j<=p;j++)
            dp[i][j]=N;
    for(i=1;i<=n;i++)
        dp[i][1]=ans[i];
    if(n==p) printf("0\n");
    else
    {
        dfs(1,0);
        Min=N;
        for(i=1;i<=n;i++)
            Min=min(Min,dp[i][p]);
        printf("%d\n",Min);
    }
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/dowson/p/3334277.html

<think>我们正在讨论硬盘在RAID阵列中的状态,特别是'unconfiguredbad'和'rebuilding'这两种告警状态。根据引用[1]的内容,我们可以知道:-'Unconfigured'有两种情况:一是硬盘未配置在RAID中,二是逻辑错误导致硬盘未被识别。-'Unconfiguredbad'可能是硬盘物理损坏或逻辑错误导致的未配置状态。-'Rebuilding'表示RAID阵列正在重建,通常是在更换故障硬盘后,新硬盘正在同步数据的过程。接下来,我们将详细解释这两种状态的含义、原因和解决方法。</think>### 硬盘告警状态 "Unconfigured Bad" "Rebuilding" 详解 #### 一、**Unconfigured Bad 状态** **含义**: 硬盘处于 **未配置且损坏** 的状态,表示RAID控制器检测到硬盘存在物理故障或逻辑错误,无法加入RAID阵列[^1]。包含两种可能情况: 1. **物理损坏** - 硬盘磁头故障、坏道超过阈值 - 接口电路损坏或连接异常 - SMART检测到不可恢复错误 2. **逻辑错误** - RAID元数据损坏(如RAID卡逻辑丢失) - 硬盘分区表/文件系统损坏 - 意外断电导致配置信息丢失 **影响**: - 阵列降级运行(若为冗余阵列如RAID 5/6) - 数据完整性风险(需立即处理) **解决方法**: ```mermaid graph LR A[检测状态] --> B{故障类型} B -->|物理损坏| C[更换新硬盘] B -->|逻辑错误| D[尝试修复] D --> D1[导入RAID逻辑数据] D --> D2[重建元数据] D --> D3[低级格式化] C --> E[启动Rebuild] ``` 具体步骤: 1. **物理损坏处理** - 立即更换硬盘 - 执行阵列重建(见Rebuilding部分) 2. **逻辑错误修复** - 通过RAID管理工具 **重新导入逻辑配置**(如MegaCLI命令): ```bash MegaCli -CfgForeign -Import -aALL # 导入外部配置 ``` - 使用`fsck`或`chkdsk`修复文件系统 - 终极方案:备份数据后执行低级格式化 #### 二、**Rebuilding 状态** **含义**: RAID阵列正在 **自动重建数据** 到新硬盘,通常发生在: - 更换故障硬盘后 - 添加热备盘触发自动重建 - 手动启动重建任务 **核心过程**: $$ \text{重建速率} = \frac{\text{阵列容量}}{\text{重建时间}} \propto \frac{1}{\text{硬盘数量} \times \text{负载强度}} $$ 重建期间阵列处于脆弱状态(二次故障将导致数据丢失) **最佳实践**: 1. **环境准备** - 确保UPS供电稳定 - 关闭非必要服务降低负载 2. **监控参数** ```bash # MegaCLI监控示例 MegaCli -PDList -aAll | grep 'Rebuild Progress' # 输出:Rebuild Progress: 45% # 重建进度百分比 ``` 3. **加速技巧** - 调整重建优先级(如Dell PERC卡的`Background Initialization Rate`) - 启用高速缓存策略:`WriteBack` > `WriteThrough` #### 三、关键操作对比 | 状态 | 风险等级 | 处理窗口 | 数据影响 | |---------------|----------|----------|-------------------| | Unconfigured Bad | ★★★★ | 紧急 | 立即丢失冗余保护 | | Rebuilding | ★★☆ | 持续监控 | 重建失败导致崩溃 | #### 四、高级故障处理 当出现 **"Unconfigured Bad" 且无法重建** 时: 1. 使用`ddrescue`尝试镜像损坏盘数据: ```bash ddrescue /dev/sdb /mnt/backup/sdb.img rescue.log ``` 2. 通过RAID重组工具重构阵列(如`R-Studio`、`UFS Explorer`) 3. 专业数据恢复服务(开盘处理) > **重要原则**: > - 重建过程中禁止强制重启 > - 物理损坏硬盘需专业检测后再弃用 > - 定期验证备份完整性(推荐3-2-1备份策略) --- ### 相关问题 1. **如何判断"Unconfigured Bad"是物理损坏还是逻辑错误?** 2. **RAID 5阵列在Rebuilding时发生第二块硬盘故障该如何挽救数据?** 3. **哪些因素会影响RAID重建速度?如何优化重建时间?** 4. **企业级存储中"Global Hot Spare"和"Dedicated Hot Spare"有何区别?** 5. **如何预防由Unconfigured Bad状态引发的数据灾难?** [^1]: 引用自RAID技术文档:物理损坏需更换硬盘,逻辑错误可通过导入配置修复
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值