• 洛谷P2763 试题库问题(最大流)


    题意

    $n$道试题,每道题有多种类别属性

    抽取$m$道题组成试卷,要求包含指定的类型

    输出方案

    Sol

    又是一道zz网络流

    我的构图长这样,$k_i$表示第$i$道试题需要的数量

    #include<cstdio>
    #include<queue>
    #include<cstring>
    using namespace std;
    const int MAXN = 1e5 + 10, INF = 1e9 + 10;
    inline int read() {
        char c = getchar(); int x = 0, f = 1;
        while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
        while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
        return x * f;
    }
    int K, N, S, T;
    int need[MAXN];
    vector<int>ans[MAXN];
    struct Edge {
        int u, v, f, nxt;
    }E[MAXN];
    int head[MAXN], cur[MAXN], num;
    inline void add_edge(int x, int y, int f) {
        E[num] = (Edge){x, y, f, head[x]};
        head[x] = num++;
    }
    inline void AddEdge(int x, int y, int z) {
        add_edge(x, y, z);
        add_edge(y, x, 0);
    }
    int sum = 0, deep[MAXN];
    bool BFS() {
        queue<int> q; q.push(S);
        memset(deep, 0, sizeof(deep)); deep[S] = 1;
        while(!q.empty()) {
            int p = q.front(); q.pop();
            for(int i = head[p]; i != -1; i = E[i].nxt) {
                int to = E[i].v;
                if(!deep[to] && E[i].f) {
                    deep[to] = deep[p] + 1;
                    q.push(to);
                }
            }
        }
        return deep[T] > 0;
    }
    int DFS(int x, int flow) {
        if(x == T) return flow;
        int ansflow = 0;
        for(int &i = cur[x]; i != -1; i = E[i].nxt) {
            int to = E[i].v;
            if(deep[to] == deep[x] + 1 && E[i].f) {
                int nowflow = DFS(to, min(flow, E[i].f));
                E[i].f -= nowflow; E[i ^ 1].f += nowflow;
                ansflow += nowflow; flow -= nowflow;
                if(flow <= 0) break;
            }
        }
        return ansflow;
    }
    int Dinic() {
        int ans = 0;
        while(BFS()) {
            memcpy(cur, head, sizeof(head));
            ans += DFS(S, INF);
        }
        return ans;
    }
    int main() {
        memset(head, -1, sizeof(head));
        K = read(); N = read(); S = 0; T = N + K + 1;
        int sum = 0;
        for(int i = 1; i <= K; i++) {
            int x = read(); sum += x;
            AddEdge(N + i, T, x);
        }
        for(int i = 1; i <= N; i++) {
            int n = read();
            AddEdge(S, i, 1);
            for(int j = 1; j <= n; j++) {
                AddEdge(i, read() + N, 1);
            }
        }
        if(Dinic() < sum) {puts("No Solution!"); return 0;}
        for(int x = 1; x <= N; x++) 
            for(int i = head[x]; i != -1; i = E[i].nxt) 
                if(E[i].f == 0) 
                    ans[E[i].v - N].push_back(x);
        for(int i = 1; i <= K; i++) {
            printf("%d: ", i);
            for(int j = 0; j < ans[i].size(); j++) printf("%d ", ans[i][j]);
            puts("");
        }
        return 0;
    }
  • 相关阅读:
    js string format All In One
    CSS water wave effect All In One
    Github PR 时合并多次提交的 git commits All In One
    js auto selector dom by providing id All In One
    JSS All In One
    python 中将fastq文件保存为字典
    python 中统计fasta文件中每条序列的长度
    c语言中利用do while循环语句限制用户的输入范围
    python中记录程序运行时间
    c语言中的do while循环语句
  • 原文地址:https://www.cnblogs.com/zwfymqz/p/9366061.html
Copyright © 2020-2023  润新知