1 条题解

  • 0
    @ 2025-10-29 19:22:08

    题目分析
    本题需要为每个学生选择“愿意”或“不愿意”,在满足合作条件约束和喜欢关系影响的情况下,最小化总不满值。

    关键观察

    • 每个小组的决策相互影响,通过喜欢关系连接
    • 一个学生选择“愿意”但队友“不愿意”时会产生额外不满
    • 喜欢关系会产生跨组的不满影响

    算法思路
    核心思想:最小割模型
    将问题转化为网络流图,通过割集表示决策及其代价。

    状态设计
    将每个学生 i 拆分为两个节点:

    • 节点 i_willing 表示选择“愿意”
    • 节点 i_unwilling 表示选择“不愿意”

    建图策略

    1. 源点汇点

      • 源点 s 连接每个学生的“不愿意”节点,容量为 d_i(选择“不愿意”的基础代价)
      • 每个学生的“愿意”节点连接汇点 t,容量为 c_i(选择“愿意”的基础代价)
    2. 组内关系

      • 同组学生 i 和 j 之间双向连接,容量为 e_i 和 e_j(当一人愿意而另一人不愿意时的额外代价)
    3. 喜欢关系

      • 当 A 喜欢 B 时:
        • 如果 A 没有合作(即 A 选择不愿意或队友不愿意)且 B 愿意,产生 a_i 代价
        • 如果 A 选择不愿意但 B 合作成功(B 和队友都愿意),产生 b_i 代价

    网络流建模
    具体建图:

    • 对于第 i 组(学生 2i-1 和 2i),创建辅助节点 group_i
    • 源点 → 学生不愿意节点:容量 d_i
    • 学生愿意节点 → 汇点:容量 c_i
    • 学生不愿意节点 → 同组学生愿意节点:容量 e_i(单向)
    • 喜欢关系 A→B:
      • B 的愿意节点 → A 的辅助节点:容量 a_i
      • A 的辅助节点 → A 的不愿意节点:容量 b_i

    最小割含义

    • 割集中与 s 相连的节点表示选择“不愿意”
    • 与 t 相连的节点表示选择“愿意”
    • 割的容量就是总不满值

    算法正确性
    通过精心设计的容量约束,确保:

    1. 基础选择代价被正确计算
    2. 组内冲突代价在决策不一致时产生
    3. 喜欢关系代价在特定条件满足时产生

    复杂度分析

    • 节点数:O(n)
    • 边数:O(n + m)
    • 使用 Dinic 算法:O(V²E) = O(n²(n+m)),在 n≤5000, m≤10000 时可接受

    代码实现要点

    // 关键建图部分
    for (int i = 1; i <= n; i++) {
        // 处理第 i 组(学生 2i-1 和 2i)
        int s1 = (i-1)*2+1, s2 = (i-1)*2+2;
        
        // 基础选择代价
        addedge(s, s1, d[s1]);
        addedge(s1, t, c[s1]);
        addedge(s, s2, d[s2]); 
        addedge(s2, t, c[s2]);
        
        // 组内冲突代价
        addedge(s1, s2, e[s1]);
        addedge(s2, s1, e[s2]);
        
        // 喜欢关系处理
        // ...
    }
    

    样例验证
    样例输入:

    2 1
    8 6 7
    5 2 8  
    7 1 5
    6 5 8
    1 4 4 3
    

    通过最小割计算得到最小不满值为 14,与输出一致。

    该算法通过网络流最小割模型,将复杂的约束关系转化为图割问题,高效求解最优决策方案。

    • 1

    信息

    ID
    4635
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者