首页 > 其他分享 >P3701 题解

P3701 题解

时间:2023-01-03 16:55:32浏览次数:63  
标签:head return int 题解 P3701 flow vis dis

前言

题目传送门!

更好的阅读体验?

比较简单的最大流基础建图题。

以下为了方便,我们把 byx 称作 A,把诗乃酱称作 B。

思路

首先发现,人物的唯一限制就是寿命。所以:

  • 从源点向每个 A 的人连边,流量是人物的寿命。
  • 从每个 B 的人向汇点连边,流量是人物的寿命。

代码

#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
const int N = 205;
struct Edge {int now, nxt, w;} e[N * 2 + N * N];
int head[N], _head[N], cur = 1;
void add(int u, int v, int w)
{
    e[++cur].now = v, e[cur].nxt = head[u], e[cur].w = w;
    head[u] = cur;
}
void ADD(int u, int v, int w) {add(u, v, w), add(v, u, 0);}
int s, t;
bool vis[N]; int dis[N];
bool bfs()
{
    queue <int> q;
    memset(vis, false, sizeof vis);
    q.push(s), vis[s] = true, dis[s] = 0, _head[s] = head[s];
    while (!q.empty())
    {
        int u = q.front(); q.pop();
        for (int i = head[u]; i; i = e[i].nxt)
        {
            int v = e[i].now;
            if (vis[v] || !e[i].w) continue;
            vis[v] = true, dis[v] = dis[u] + 1, _head[v] = head[v];
            if (v == t) return true;
            q.push(v);
        }
    }
    return false;
}
int dfs(int u, int maxflow)
{
    if (u == t) return maxflow;
    int flow = 0;
    for (int i = _head[u]; i && flow < maxflow; i = e[i].nxt)
    {
        _head[u] = i;
        int v = e[i].now;
        if (dis[v] != dis[u] + 1 || !e[i].w) continue;
        int ww = dfs(v, min(maxflow - flow, e[i].w));
        if (ww == 0) dis[v] = -114514;
        e[i].w -= ww, e[i ^ 1].w += ww, flow += ww;
    }
    return flow;
}
int dinic()
{
    int ans = 0, flow;
    while (bfs())
        while (flow = dfs(s, 2147483647))
            ans += flow;
    return ans;
}

const bool dict[5][5] = {
    0, 1, 1, 0, 0,
    0, 0, 1, 1, 0, 
    0, 0, 0, 1, 1, 
    1, 0, 0, 0, 1, 
    1, 1, 0, 0, 0
};
int read()
{
    string s;
    cin >> s;
    if (s == "J") return 0;
    if (s == "HK") return 1;
    if (s == "W") return 2;
    if (s == "E") return 3;
    if (s == "YYY") return 4;
}
int a[N], b[N];

int main()
{
    ios::sync_with_stdio(false);
    int n, m, cnta = 0, cntb = 0;
    cin >> n >> m;
    s = 0, t = 2 * n + 1;
    for (int i = 1; i <= n; i++)
    {
        a[i] = read();
        if (a[i] == 4) cnta++; //统计YYY的个数
    }
    for (int i = 1; i <= n; i++)
    {
        b[i] = read();
        if (b[i] == 4) cntb++; //统计YYY的个数
    }
    for (int i = 1; i <= n; i++)
    {
        int w;
        cin >> w;
        if (a[i] == 0) w += cnta; //每一个YYY都可以给J续命
        ADD(s, i, w);
    }
    for (int i = 1; i <= n; i++)
    {
        int w;
        cin >> w;
        if (b[i] == 0) w += cntb; //每一个YYY都可以给J续命
        ADD(i + n, t, w);
    }    
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            if (dict[a[i]][b[j]])
                ADD(i, j + n, 1);
    cout << min(dinic(), m);
    return 0;
}

希望能帮助到大家!

标签:head,return,int,题解,P3701,flow,vis,dis
From: https://www.cnblogs.com/liangbowen/p/17022736.html

相关文章

  • ros,unknown package [geometry_msgs] 问题解决
    CMakeLists.txt:在find_package中添加 geometry_msgs:                          2.在generate_messages里添......
  • laravel生成PDF使用插件barryvdh/laravel-dompdf及中文乱码问题解决
    使用1.composer安装composerrequirebarryvdh/laravel-dompdf2.发布配置文件,生成的配置文件config/dompdf.php,也可选择忽略此步骤phpartisanvendor:publish......
  • CF446D 题解
    题意传送门给定一张\(n\)个点\(m\)条边的无向图,每个节点有权值\(v_i=\)\(0/1\)。角色从节点\(1\)开始随机游走,走到\(n\)停止。求其经过路径上权值和等于\(k-1......
  • 洛谷2022年十二月月赛题解(作者:Kubic)
    T1只有第一秒走的长度为奇数,后面每一秒走的长度都为偶数,因此所有除\(0\)外的偶数点都是不可达的。当\(n\)为奇数时,设\(d\)为满足\(\sum\limits_{i=1}^d2^{i-1}\g......
  • C# 反射获取属性GetProperty无效的问题解决方法
    1·(20条消息)C#反射获取属性GetProperty无效的问题解决方法_不卡机的博客-CSDN博客_c#getproperty2·C#type.GetType().GetProperty("属性名")_已解决_博问_博客园(......
  • 寒假第一次洛谷蓝桥个人赛 题解+补题(上)
    传送门部分,今天整不完了A.带分数(补题)##这...话说赛时难以置信地看了好几遍题目,然后完全没思路(我以为有什么神仙结论,压根没想暴力搜索,还是被虎到了,然后就根本没管这道......
  • [Phoenix基础]-- 常见问题解答
    常问问题​​我想开始 有没有凤凰HelloWorld?​​​​凤凰城有没有办法批量加载?​​​​如何将Phoenix表映射到现有的HBase表?​​​​有没有任何提示来优化凤凰?​​​​如......
  • Codeforces Good Bye 2022 CF 1770 F Koxia and Sequence 题解
    题目链接注意题目要求的是所有好序列的所有元素的XOR之和的XOR之和。我一开始以为是所有XOR之和的加法和导致不知道官方题解在讲什么。假设我们枚举一个位置\(1\lei\le......
  • [NOI2018] 归程 题解
    题目描述[NOI2018]归程思路题目说,所有海拔\(\leqp\)的边都会有积水,因此所有的边分为了两个集合\(S_车,S_步\),其中\(S_车\)所有的边的海拔都\(>p\),\(S_步\)反......
  • Codeforces Round 789 div2 A-E题解 & 处理手法思考
    A.TokitsukazeandAllZeroSequence这题给一个数列,每次操作对于两个不相同的数字可以吧大的变成min,两个相同的话一个变为0问最少操作多少次能将整个数组变为0首......