• POJ1698 Alice's Chance 最大流


    不会sap,邻接矩阵过。

    #include <cstdlib>
    #include <cstring>
    #include <cstdio>
    #include <queue>
    #define MAXN 375
    #define INF 0x3f3f3f3f
    using namespace std;

    int cap[MAXN+1][MAXN+1], flow[MAXN+1][MAXN+1], N;
    int p[MAXN+1], c[MAXN+1];
    int seq[25][15], maxflow;

    inline void init()
    {
    maxflow = 0;
    memset(cap, 0, sizeof (cap));
    memset(flow, 0, sizeof (flow));
    }

    inline int min(int a, int b)
    {
    return a < b ? a : b;
    }

    void bfs()
    {
    int finish = 0, pos;
    while (!finish) {
    memset(c, 0, sizeof (c)); // 记录推送流量
    c[0] = INF;
    queue<int>q;
    q.push(0);
    while (!q.empty()) {
    if (c[MAXN])
    break;
    pos = q.front();
    q.pop();
    for (int i = 0; i <= MAXN; ++i) {
    if (!c[i] && flow[pos][i] < cap[pos][i]) {
    c[i] = min(c[pos], cap[pos][i]-flow[pos][i]);
    p[i] = pos;
    q.push(i);
    }
    }
    }
    maxflow -= c[MAXN];
    if (c[MAXN] == 0) {
    finish = 1;
    break;
    }
    pos = MAXN;
    while (pos != 0) {
    flow[p[pos]][pos] += c[MAXN];
    flow[pos][p[pos]] -= c[MAXN];
    pos = p[pos];
    }
    }
    }

    int main()
    {
    int T;
    scanf("%d", &T);
    while (T--) {
    init();
    scanf("%d", &N);
    for (int i = 0; i < N; ++i) {
    for (int j = 0; j < 9; ++j) {
    scanf("%d", &seq[i][j]);
    }
    maxflow += seq[i][7];
    cap[0][i+1] = seq[i][7];
    for (int j = 0; j < 7; ++j) {
    if (seq[i][j]) {
    for (int k = 0; k < seq[i][8]; ++k) {
    cap[i+1][k*7+N+1+j] = 1;
    cap[k*7+N+1+j][MAXN] = 1;
    }
    }
    }
    }
    bfs();
    if (maxflow == 0) {
    puts("Yes");
    }
    else {
    puts("No");
    }
    }
    return 0;
    }



  • 相关阅读:
    Git 总结
    .net报错大全
    对于堆和栈的理解
    html 局部打印
    c#面试问题总结
    算法题总结
    h5-plus.webview
    堆和栈,引用类型,值类型,指令,指针
    .NET framework具体解释
    前端之间的url 传值
  • 原文地址:https://www.cnblogs.com/Lyush/p/2427198.html
Copyright © 2020-2023  润新知