首页 > 其他分享 >「P4313」文理分科 解题报告

「P4313」文理分科 解题报告

时间:2023-08-08 12:12:10浏览次数:42  
标签:分科 return 行第 flow 整数 选择 文理 P4313 ll

「P4313」文理分科

题目描述

文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过)

小 P 所在的班级要进行文理分科。他的班级可以用一个 \(n\times m\) 的矩阵进行描述,每个格子代表一个同学的座位。每位同学必须从文科和理科中选择一科。同学们在选择科目的时候会获得一个满意值。满意值按如下的方式得到:

  • 如果第 \(i\) 行第 \(j\) 列的同学选择了文科,则他将获得 \(art_{i,j}\) 的满意值,如果选择理科,将得到 \(science_{i,j}\) 的满意值。

  • 如果第 \(i\) 行第 \(j\) 列的同学选择了文科,并且他相邻(两个格子相邻当且仅当它们拥有一条相同的边)的同学全部选择了文科,则他会更开心,所以会增加 \(same\text{\underline{ }}art_{i,j}\) 的满意值。

  • 如果第 \(i\) 行第 \(j\) 列的同学选择了理科,并且他相邻的同学全部选择了理科,则增加 \(same\text{\underline{ }}science_{i,j}\) 的满意值。

小 P 想知道,大家应该如何选择,才能使所有人的满意值之和最大。请告诉他这个最大值。

输入格式

输入第一行为两个正整数 \(n,m\)。
接下来 \(n\) 行 \(m\) 个整数,第 \(i\) 行第 \(j\) 个整数表示 \(art_{i,j}\);
接下来 \(n\) 行 \(m\) 个整数,第 \(i\) 行第 \(j\) 个整数表示 \(science_{i,j}\);
接下来 \(n\) 行 \(m\) 个整数,第 \(i\) 行第 \(j\) 个整数表示 \(same\text{\underline{ }}art_{i,j}\);
接下来 \(n\) 行 \(m\) 个整数,第 \(i\) 行第 \(j\) 个整数表示 \(same\text{\underline{ }}science_{i,j}\)。

输出格式

输出为一个整数,表示最大的满意值之和。

样例 #1

样例输入 #1

3 4
13 2 4 13
7 13 8 12
18 17 0 5
8 13 15 4
11 3 8 11
11 18 6 5
1 2 3 4 
4 2 3 2
3 1 0 4
3 2 3 2
0 2 2 1
0 2 4 4

样例输出 #1

152

提示

样例说明

1 表示选择文科,0 表示选择理科,方案如下:

1 0 0 1

0 1 0 0

1 0 0 0

数据范围

\(n,m\leq 100\),读入数据均 \(\leq 500\)。

SOLUTION

考虑最小割,通过连\(INF\)边强制让相邻的点不割距离超过\(D\)的边

如果没有光滑性限制

这个题就是一个ruozhi简单的最小割

在第\(r\)层的点\(x(i,j)\)与下一层 \(y\) 的连\((x,y,v[r][i][j])\)

(因为是每一\((i,j)\)选一个切割点)

这种选择的就可以考虑最小割

那有光滑限制怎么办呢

23031109014111png 699×69 fzoitop

其实就是不能切割相邻的\((x,y)\)和\((x',y')\)的\(r\)距离要小于等于D

那么我们就保证相邻的点的\(r\)距离大于D的不会被切割好了

\((x,y)→(x',y'),flow=INF\)

over!

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+2,INF=1e9,M=1e2+2;
struct node{ll to,val,nxt;}e[N*2];
ll a,n,vis[N],d[N],hd[N],m,ans,cnt,sum,S,T;
const ll dx[]={0,1,0,-1,0},dy[]={1,0,-1,0,0};
bool ok(ll x,ll y){return x>=1&&x<=n&&y>=1&&y<=m;}
void add(ll x,ll y,ll c){
    e[++cnt]={y,c,hd[x]};
    hd[x]=cnt;
}
bool bfs(){
    queue<ll>q;
    memset(d,0,sizeof(d));
    q.push(S);d[S]=1;
    while(!q.empty()){
        ll x=q.front();q.pop();
        for(ll i=hd[x];~i;i=e[i].nxt){
            ll y=e[i].to,w=e[i].val;
            if(w&&!d[y]){
                d[y]=d[x]+1;
                q.push(y);
                if(y==T) return 1; 
            }
        }
    }
    return 0;
}
ll dinic(ll x,ll flow){
    if(x==T) return flow;
    ll r=flow,k;
    for(ll i=hd[x];~i&&r;i=e[i].nxt){
        ll y=e[i].to,w=e[i].val;
        if(w&&d[y]==d[x]+1){
            k=dinic(y,min(r,w));
            if(!k)d[y]=0;
            e[i].val-=k;
            e[i^1].val+=k;
            r-=k;
            if(!r) return flow;
        }
    }
    return flow-r;
}
int main(){
    scanf("%lld%lld",&n,&m);
    cnt=1;
    S=0,T=3*n*m+1;
    memset(hd,-1,sizeof(hd));
    for(ll i=1;i<=n;i++){
        for(ll j=1;j<=m;j++){
            scanf("%lld",&a);
            sum+=a;
            ll x=(i-1)*m+j;
            add(S,x,a),add(x,S,0);
        }
    }
    for(ll i=1;i<=n;i++){
        for(ll j=1;j<=m;j++){
            scanf("%lld",&a);
            sum+=a;
            ll x=(i-1)*m+j;
            add(x,T,a),add(T,x,0);
        }
    }
    for(ll i=1;i<=n;i++){
        for(ll j=1;j<=m;j++){
            scanf("%lld",&a);
            sum+=a;
            ll x=(i-1)*m+j+n*m;
            add(S,x,a),add(x,S,0);
        }
    }
    for(ll i=1;i<=n;i++){
        for(ll j=1;j<=m;j++){
            scanf("%lld",&a);
            sum+=a;
            ll x=(i-1)*m+j+n*m*2;
            add(x,T,a),add(T,x,0);
        }
    }
    for(ll i=1;i<=n;i++){
        for(ll j=1;j<=m;j++){
            ll x=(i-1)*m+j;
            for(ll k=0;k<=4;k++){
                ll xi=i+dx[k],yj=j+dy[k];
                if(!ok(xi,yj))continue;
                ll y=(xi-1)*m+yj;
                add(x+n*m,y,INF),add(y,x+n*m,0);
                add(y,x+n*m*2,INF),add(x+n*m*2,y,0);
            }
        }
    }
    while(bfs()){
        ans+=dinic(S,INF);
    }
    printf("%lld",sum-ans);
    return 0;
}

完结撒花❀

★,°:.☆( ̄▽ ̄)/$:.°★

标签:分科,return,行第,flow,整数,选择,文理,P4313,ll
From: https://www.cnblogs.com/yvette1217/p/17613824.html

相关文章

  • 阅读圣经丨测试上下文理解
    在《圣经2》中,关于上下文理解这一块,白茶看到两个有意思的小测试,决定分享给各位小伙伴。这是一份销售数据,将其导入到PowerBI中。结果如图。现在开始进行问题描述。问题一:为数据模型添加计算列,输入如下代码公式,结果是什么?销售额=SUM('示例'[销售价])A、[销售额]所在的每一行的数......
  • 一文理解什么是DTO、VO、BO、PO、DO,并推荐一款IDEA转换插件
     1、什么是DTO、VO、BO、PO、DO、POJOPOJO的定义是无规则简单的对象,在日常的代码分层中pojo会被分为VO、BO、PO、DTO。通过各层POJO的使用,有助于提高代码的可读性和可维护性。概念看似简单,但是想区分好或者理解好也不容易,本文简单梳理一下。DTO(DataTransferObject)数据传......
  • 一文理清排序算法中的直接插入、快排和希尔排序的区别
    前言在上一篇文章中,给大家介绍了冒泡排序和选择排序,这两种算法都是排序算法。实际上排序算法还有插入、希尔、快速排序等,接下来我们就来学习一下这几种排序算法。全文大约【5400】字,不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富的案例及配图视频,让你更好地理......
  • 一文理解TS泛型
    当我们在编写TypeScript代码时,经常会遇到需要通用(Generic)的情况,这时候,泛型就是我们的好帮手了。在本篇文章中,我们将深入介绍TypeScript泛型的概念以及如何使用。什么是泛型?在编程语言中,泛型指的是参数化类型的概念。也就是说,我们可以定义一个函数、接口或类等,能够处理不同类......
  • 论文理解【Offline RL】——【One-step】Offline RL Without Off-Policy Evaluation
    标题:OfflineRLWithoutOff-PolicyEvaluation文章链接:OfflineRLWithoutOff-PolicyEvaluation代码:davidbrandfonbrener/onestep-rl发表:NIPS2021领域:离线强化学习(off......
  • luogu「P4313」文理分科 解题报告
    题目描述文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过)小P所在的班级要进行文理分科。他的班级可以用一个\(n\timesm\)的矩阵进行描述,每个格子......
  • 一文理解JVM的程序计数器(PC)
    目录1功能演示2跳转、循环等执行的执行原理3关于PC的面试题JVM中的程序计数寄存器(ProgramCounterRegister)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的......
  • [论文理解] A Survey on Causal Inference
    InformationAuthorsLIUYIYAO,AlibabaGroupZHIXUANCHUandSHENGLI,UniversityofGeorgiaYALIANGLI,AlibabaGroupJINGGAO,PurdueUniversityAIDONGZHANG......
  • 文理分科问题 网络流划分
    文理分科问题网络流划分题目大意全班分科,每位同学分到文科能获得一定满意值,分到理科能获得一定满意值,如果上下左右的同学都被分到同一科也能增加一定的满意值,要求找到最......
  • 一文理解vuex和pinia的区别
    一文理解vuex和pinia的区别......