博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P4313 文理分科
阅读量:7191 次
发布时间:2019-06-29

本文共 2372 字,大约阅读时间需要 7 分钟。

思路

遇到这种利益冲突的最终利益最大化问题

考虑转化为最小割,使得损失的价值最小
相当于文科是S,理科是T,选出最小割就是确定损失代价最小的方案
然后就把S向每个点连一条cap=art[i][j]的边,每个点向T连一条cap=science[i][j]的边,再新建n*m个点表示同选文科的利益,然后S向每个新建点连一条cap=same_art[i][j]的边,然后再从新建点向每个点和它的相邻点向连一条cap=INF的边,然后同选立刻的收益同理新建点再向T连边,相邻点同理的向新建点连边
再跑出最小割即可

代码

#include 
#include
#include
#include
#include
using namespace std;struct Edge{ int u,v,cap,flow;};const int MAXN = 40100;const int INF = 0x3f3f3f3f;vector
edges;vector
G[MAXN];void addedge(int u,int v,int cap){ edges.push_back((Edge){u,v,cap,0}); edges.push_back((Edge){v,u,0,0}); int cnt=edges.size(); G[u].push_back(cnt-2); G[v].push_back(cnt-1);}int cur[MAXN],dep[MAXN],vis[MAXN],s,t;int dfs(int x,int a){ if(x==t||a==0) return a; int f,flow=0; for(int &i=cur[x];i
0){ flow+=f; e.flow+=f; edges[G[x][i]^1].flow-=f; a-=f; if(!a) break; } } return flow;}queue
q;bool bfs(void){ memset(vis,0,sizeof(vis)); dep[s]=0; vis[s]=true; q.push(s); while(!q.empty()){ int x=q.front(); q.pop(); for(int i=0;i
e.flow&&(!vis[e.v])){ vis[e.v]=true; dep[e.v]=dep[x]+1; q.push(e.v); } } } return vis[t];}int dinic(void){ int flow=0; while(bfs()){ // printf("Not Re\n"); memset(cur,0,sizeof(cur)); flow+=dfs(s,INF); } return flow;}int n,m,same_wen[110][110],same_li[110][110],wen[110][110],li[110][110],sum=0;const int mx[] = {0,0,1,-1,0},my[] ={0,1,0,0,-1};int id(int x,int y,int idx=0){ return (x-1)*m+y+idx*n*m;}int main(){ scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ scanf("%d",&wen[i][j]); sum+=wen[i][j]; } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ scanf("%d",&li[i][j]); sum+=li[i][j]; } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ scanf("%d",&same_wen[i][j]); sum+=same_wen[i][j]; } for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ scanf("%d",&same_li[i][j]); sum+=same_li[i][j]; } // printf("Not Re\n"); s=MAXN-2;//wen t=MAXN-3;//li for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ addedge(s,id(i,j),wen[i][j]);//wen addedge(id(i,j),t,li[i][j]);//li } for(int i=1;i<=n;i++)//shang for(int j=1;j<=m;j++){ addedge(s,id(i,j,1),same_wen[i][j]); addedge(id(i,j,1),id(i,j),INF); if(i>1) addedge(id(i,j,1),id(i-1,j),INF); if(j>1) addedge(id(i,j,1),id(i,j-1),INF); if(i
1) addedge(id(i-1,j),id(i,j,2),INF); if(j>1) addedge(id(i,j-1),id(i,j,2),INF); if(i

转载于:https://www.cnblogs.com/dreagonm/p/10511744.html

你可能感兴趣的文章
vim常用命令
查看>>
【计算几何】CDOJ1720 几何几何
查看>>
阿里云挂载数据盘
查看>>
使用selenium模拟浏览器抓取淘宝商品美食信息
查看>>
MongoDB服务无法启动,windows提示发生服务特定错误:100
查看>>
A Simple OpenGL Shader Example
查看>>
资料整理面试
查看>>
理解JavaScript中的事件处理
查看>>
lock: mutex/spinlock/shared lock
查看>>
基于JAVA的身份证实名认证接口调用代码实例
查看>>
Shell命令-文件压缩解压缩之tar、unzip
查看>>
挺有意思的一段VBS代码,让系统阅读/朗读指定文本
查看>>
mysql体系结构
查看>>
CSS实现图片半透明代码
查看>>
hdu 4135 Co-prime (素数打表+容斥原理)
查看>>
manacher算法求最长回文子串
查看>>
(转)IDataGridViewEditingControl 接口 作用
查看>>
ie兼容性问题的一些总结,待添加。后续有图
查看>>
获取客户端IP
查看>>
【论文阅读】StainGAN: Stain Style Transfer for Digital Histological Images
查看>>