洛谷P2774_方格取数问题_最大流_最小割

本文介绍了一种解决矩阵中选取不相邻元素以获得最大和的问题的方法。通过构建二分图并运用最大流算法,文章详细阐述了如何有效解决该问题,并提供了完整的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意

m * n 的矩阵中取数,不能取相邻的数,求能取得的数的和最大为多少。

思路

(i, j) 为 i 行 j 列的单元格,根据 i + j 的奇偶性将节点分为两个集合,在矩阵中相邻得节点分别在图的两侧,得一个二分图。

s 点向左侧节点建边,容量为节点在矩阵中的值。

右侧节点向t 建边,容量为节点在矩阵中的值。

左侧节点向在矩阵中相邻的右侧节点建立容量为INF的边。

进入S集的右侧节点不取,进入T集的左侧节点不取,所得的最小割的值即为不取的数的和。

ans = sum - max_flow

 

左侧节点a和右侧节点b,如果在矩阵中相邻,则必须同时进入S集或T集,也就是说,a和b不能同时取得(如果同时进入S集则取a不取b)。因此建图时,a和b之间的边容量为INF,INF的边不能进入割集。

选择a和b进入S集或T集的过程是同过 比较a和b的权值 决策取舍a和b的过程。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#define INF 0x3f3f3f3f
#define rep0(i, n) for (int i = 0; i < n; i++)
#define rep1(i, n) for (int i = 1; i <= n; i++)
#define rep_0(i, n) for (int i = n - 1; i >= 0; i--)
#define rep_1(i, n) for (int i = n; i > 0; i--)
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
#define mem(x, y) memset(x, y, sizeof(x))
#define MAXN 110
using namespace std;
typedef long long ll;
const int S = 0, T = MAXN * MAXN - 1;
struct Edge
{
    int to, cap, flow, rev;
};
vector<Edge> g[MAXN * MAXN];
int grid[MAXN][MAXN], m, n;
int idx(int i, int j)
{
    return i * n + j + 1;
}
void addEdge(int u, int v, int cap)
{
    g[u].push_back((Edge){v, cap, 0, g[v].size()});
    g[v].push_back((Edge){u, 0, 0, g[u].size() - 1});
}
int level[MAXN * MAXN], itr[MAXN * MAXN];
queue<int> q;
void bfs()
{
    mem(level, -1);
    q.push(S);
    level[S] = 0;

    while (!q.empty())
    {
        int u = q.front();
        q.pop();
        for (int i = 0; i < g[u].size(); i++)
        {
            Edge e = g[u][i];
            if (level[e.to] < 0 && e.cap > e.flow)
            {
                level[e.to] = level[u] + 1;
                q.push(e.to);
            }
        }
    }

}
int dfs(int u, int f)
{
    if (u == T)
        return f;
    for (int& i = itr[u]; i < g[u].size(); i++)
    {
        Edge& e = g[u][i];
        if (level[e.to] > level[u] && e.cap > e.flow)
        {
            int d = dfs(e.to, MIN(f, e.cap - e.flow));

            if (d)
            {
                e.flow += d;
                g[e.to][e.rev].flow -= d;
                return d;
            }
        }
    }
    return 0;
}
ll max_flow()
{
    ll flow = 0;
    while (true)
    {
        bfs();
        if (level[T] < 0)
            return flow;
        ll f;
        mem(itr, 0);

        while ((f = dfs(S, INF)) > 0)
        {
            flow += f;
        }
    }
}
int main()
{
    #ifndef ONLINE_JUDGE
        freopen("in.txt", "r", stdin);
    #endif // ONLINE_JUDGE
    ll ans = 0;
    scanf("%d %d", &m, &n);
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++)
        {
            scanf("%d", &grid[i][j]);
            ans += grid[i][j];
        }

    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if ((i + j) & 1)
            {
                addEdge(idx(i, j), T, grid[i][j]);
                if (i - 1 >= 0)
                    addEdge(idx(i - 1, j), idx(i, j), INF);
                if (j - 1 >= 0)
                    addEdge(idx(i, j - 1), idx(i, j), INF);
            }
            else
            {
                addEdge(S, idx(i, j), grid[i][j]);
                if (i - 1 >= 0)
                    addEdge(idx(i, j), idx(i - 1, j), INF);
                if (j - 1 >= 0)
                    addEdge(idx(i, j), idx(i, j - 1), INF);
            }



        }
    }


    ans -= max_flow();


    printf("%lld\n", ans);




    return 0;
}

 

内容概要:本文档详细介绍了Analog Devices公司生产的AD8436真均方根-直流(RMS-to-DC)转换器的技术细节及其应用场景。AD8436由三个独立模块构成:轨到轨FET输入放大器、高动态范围均方根计算内核和精密轨到轨输出放大器。该器件不仅体积小巧、功耗低,而且具有广泛的输入电压范围和快速响应特性。文档涵盖了AD8436的工作原理、配置选项、外部组件选择(如电容)、增益调节、单电源供电、电流互感器配置、接地故障检测、三相电源监测等方面的内容。此外,还特别强调了PCB设计注意事项和误差源分析,旨在帮助工程师更好地理解和应用这款高性能的RMS-DC转换器。 适合人群:从事模拟电路设计的专业工程师和技术人员,尤其是那些需要精确测量交流电信号均方根值的应用开发者。 使用场景及目标:①用于工业自动化、医疗设备、电力监控等领域,实现对交流电压或电流的精准测量;②适用于手持式字万用表及其他便携式仪器仪表,提供高效的单电源解决方案;③在电流互感器配置中,用于检测微小的电流变化,保障电气安全;④应用于三相电力系统监控,优化建立时间和转换精度。 其他说明:为了确保最佳性能,文档推荐使用高质量的电容器件,并给出了详细的PCB布局指导。同时提醒用户关注电介质吸收和泄漏电流等因素对测量准确性的影响。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值