D - 文理分科 (网络流->最小割)
题目链接:https://cn.vjudge.net/contest/281959#problem/D
题目大意:中文题目
具体思路:我们需要求出最大的满意值,从另一方面想,我们可以求出总的满意值,然后再求出不符合情况的最小的代价,这两个相减,就能求出最大的满意值,这个时候就可以通过最小割来求了(最小割:使得整个图不连通的最小花费)。
这一篇博客讲的很好:https://blog.csdn.net/yakeding/article/details/79357545
AC代码:
- #include<iostream>
- #include<stack>
- #include<queue>
- #include<iomanip>
- #include<stdio.h>
- #include<cstring>
- #include<cstring>
- #include<cmath>
- #include<algorithm>
- #include<map>
- #include<vector>
- using namespace std;
- # define ll long long
- # define maxn +
- # define inf 0x3f3f3f3f
- int prev[maxn];//边的编号
- int head[maxn];
- int f[][]= {{,-,,},{,,,-}};
- struct node
- {
- int to;
- int flow;
- int nex;
- } edge[maxn];
- int num,st,ed;
- void init()
- {
- memset(head,-,sizeof(head));
- num=;
- }
- void addedge(int fr,int to,int flow)
- {
- edge[num].to=to;
- edge[num].flow=flow;
- edge[num].nex=head[fr];
- head[fr]=num++;
- edge[num].to=fr;
- edge[num].flow=;
- edge[num].nex=head[to];
- head[to]=num++;
- }
- bool bfs()
- {
- memset(prev,-,sizeof(prev));
- prev[st]=;
- queue<int>q;
- q.push(st);
- while(!q.empty())
- {
- int top=q.front();
- q.pop();
- for(int i=head[top]; i!=-; i=edge[i].nex)
- {
- int temp=edge[i].to;
- if(prev[temp]==-&&edge[i].flow>)
- {
- prev[temp]=prev[top]+;
- q.push(temp);
- }
- }
- }
- return prev[ed]!=-;
- }
- int dfs(int u,int flow)
- {
- if(u==ed)
- return flow;
- int res=;
- for(int i=head[u]; i!=-; i=edge[i].nex)
- {
- int t=edge[i].to;
- if(prev[t]==(prev[u]+)&&edge[i].flow>)
- {
- int temp=dfs(t,min(flow,edge[i].flow));
- edge[i].flow-=temp;
- edge[i^].flow+=temp;
- res+=temp;
- flow-=temp;
- if(flow==)
- break;
- }
- }
- if(res==)
- prev[u]=-;
- return res;
- }
- int n,m;
- int dinic()
- {
- int ans=;
- while(bfs())
- {
- ans+=dfs(st,inf);
- }
- return ans;
- }
- bool judge(int t1,int t2)
- {
- if(t1>=&&t1<=n&&t2>=&&t2<=m)
- return true;
- return false;
- }
- int main()
- {
- init();
- int sum=;
- int tmp;
- st=1e5,ed=1e5+;
- scanf("%d %d",&n,&m);
- for(int i=; i<=n; i++)
- {
- for(int j=; j<=m; j++)
- {
- scanf("%d",&tmp);
- sum+=tmp;
- addedge((i-)*m+j,ed,tmp);
- }
- }
- for(int i=; i<=n; i++)
- {
- for(int j=; j<=m; j++)
- {
- scanf("%d",&tmp);
- sum+=tmp;
- addedge(st,(i-)*m+j,tmp);
- }
- }
- for(int i=; i<=n; i++)
- {
- for(int j=; j<=m; j++)
- {
- scanf("%d",&tmp);
- addedge((i-)*m+j,((i-)*m+j)+n*m,inf);
- addedge(((i-)*m+j)+n*m,ed,tmp);
- sum+=tmp;
- for(int k=; k<; k++)
- {
- int x=i+f[][k];
- int y=j+f[][k];
- if(judge(x,y))
- addedge((x-)*m+y,((i-)*m+j)+n*m,inf);
- }
- }
- }
- for(int i=; i<=n; i++)
- {
- for(int j=; j<=m; j++)
- {
- scanf("%d",&tmp);
- sum+=tmp;
- addedge(((i-)*m+j)+n*m*,(i-)*m+j,inf);
- addedge(st,((i-)*m+j)+n*m*,tmp);
- for(int k=; k<; k++)
- {
- int x=i+f[][k];
- int y=j+f[][k];
- if(judge(x,y))
- addedge(((i-)*m+j)+n*m*,(x-)*m+y,inf);
- }
- }
- }
- // cout<<1<<endl;
- int ans=dinic();
- // cout<<1<<endl;
- printf("%d\n",sum-ans);
- return ;
- }
D - 文理分科 (网络流->最小割)的更多相关文章
- 【bzoj3894】文理分科 网络流最小割
原文地址:http://www.cnblogs.com/GXZlegend 题目描述 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理分科.他的班级可以用 ...
- BZOJ_3894_文理分科&&BZOJ_2127_happiness_最小割
BZOJ_3894_文理分科_最小割 Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进 ...
- 【BZOJ3894】文理分科(最小割)
[BZOJ3894]文理分科(最小割) 题面 BZOJ Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班级可以用一个 ...
- [Bzoj3894]文理分科(最小割)
Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行描述,每个格子代表一个同学的座位.每位 ...
- [BZOJ 3894] 文理分科 【最小割】
题目链接:BZOJ - 3894 题目分析 最小割模型,设定一个点与 S 相连表示选文,与 T 相连表示选理. 那么首先要加上所有可能获得的权值,然后减去最小割,即不能获得的权值. 那么对于每个点,从 ...
- bzoj 3894 文理分科【最小割+dinic】
谁说这道和2127是双倍经验的来着完全不一样啊? 数组开小会TLE!数组开小会TLE!数组开小会TLE! 首先sum统计所有收益 对于当前点\( (i,j) \)考虑,设\( x=(i-1)*m+j ...
- 【题解】 bzoj3894: 文理分科 (网络流/最小割)
bzoj3894,懒得复制题面,戳我戳我 Solution: 首先这是一个网络流,应该还比较好想,主要就是考虑建图了. 我们来分析下题面,因为一个人要么选文科要么选理科,相当于两条流里面割掉一条(怎么 ...
- 【bzoj3774】最优选择 网络流最小割
题目描述 小N手上有一个N*M的方格图,控制某一个点要付出Aij的代价,然后某个点如果被控制了,或者他周围的所有点(上下左右)都被控制了,那么他就算是被选择了的.一个点如果被选择了,那么可以得到Bij ...
- 【bzoj1143】[CTSC2008]祭祀river Floyd+网络流最小割
题目描述 在遥远的东方,有一个神秘的民族,自称Y族.他们世代居住在水面上,奉龙王为神.每逢重大庆典, Y族都会在水面上举办盛大的祭祀活动.我们可以把Y族居住地水系看成一个由岔口和河道组成的网络.每条河 ...
随机推荐
- Django-website 程序案例系列-3 URL详解
django参考资料:http://docs.30c.org/djangobook2/index.html urls.py是django中控制接收前端的参数指定函数去执行逻辑 第一种 函数的方式 ur ...
- IDEA在debug时修改变量值
IDEA在debug调试时修改变量值 例如以下代码: int y1 = 0; anchor.setDy1(y1); 在代码中,这个y1永远是0,但是y1本身是个变量 debug的时候获取到这个属性,并 ...
- day6 三级菜单
#__author__: Administrator #__date__: 2018/7/12 china = { "shandong":{ "linyi":[ ...
- day30 item系列
item 会将数据操作类似于字典的操作具体用到的方法 __getitem__(self, item): __setitem__(self, key, value): __delitem__(self, ...
- IDEA安装和激活
IDEA安装 按照最新版本有可能会有很多BUG的原则,我们就安装IDEA 2018.1.6版本的. 首先,我们到IDEA官网去下载IDEA,官网链接,但是这个界面的版本一般为最新的. 这里我放出IDE ...
- C# 类&结构体&枚举
类: class Lei //要和static void Main(string[] args)平级: { public int lei_int; //public是关键字,代表访问权限,这里是公 ...
- eclipse --- 新建JSP页面默认模版设置
设置 在eclipse中新建 jsp时是这样的: 有时候我们不想字符集是ISO_8859-1,想字符集是UTF-8,一个个修改会很麻烦,那么我们可以修改jsp模版的设置: window>Pref ...
- bug8 eclipse项目导入到myeclipse时 Target runtime com.genuitec.runtime.generic
1.新导入的工程,出问题很大可能是jdk的版本问题导致,检查一下,发现jdk果然不一致,修改了jdk版本,但异常没有消除 2.网上查询下解决方案,原来在工程目录下的settings,有个文件也需要修改 ...
- Linux下,根据FHS定义出来的每个目录的作用
(下表摘自<鸟哥的Linux的私房菜>) 在Linux下,根据FHS定义出来的每个目录应该放置的档案内容为: 目录 应放置档案内容 / 根目录 root (/),一般建议在根目录底下只接目 ...
- 线程优先级.Priority()
线程对象.Priority(),线程优先级1-10,10优先级最高.此功能比较鸡肋,不起作用.了解即可 以下案例:循环输出加减乘除,除优先级最高 //MyThread线程 class MyThread ...