题目大概说有一个有n*m个格子的画板,画板上每个格子都有颜色,现在要把所有格子的颜色改成红、绿或者蓝,改变的代价是二者RGB值的曼哈顿距离,还要求红绿蓝格子个数的最大值和最小值要尽可能接近,问最少的代价是多少。

红绿蓝三色的个数是可以直接确定的,分别考虑几个情况就OK了,然后就是根据红绿蓝的个数构图跑最小费用最大流。。

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<queue>
  4 #include<algorithm>
  5 using namespace std;
  6 #define INF (1<<30)
  7 #define MAXN 444
  8 #define MAXM 444*888
  9 struct Edge{
 10     int u,v,cap,cost,next;
 11 }edge[MAXM];
 12 int head[MAXN];
 13 int NV,NE,vs,vt;
 14
 15 void addEdge(int u,int v,int cap,int cost){
 16     edge[NE].u=u; edge[NE].v=v; edge[NE].cap=cap; edge[NE].cost=cost;
 17     edge[NE].next=head[u]; head[u]=NE++;
 18     edge[NE].u=v; edge[NE].v=u; edge[NE].cap=0; edge[NE].cost=-cost;
 19     edge[NE].next=head[v]; head[v]=NE++;
 20 }
 21 bool vis[MAXN];
 22 int d[MAXN],pre[MAXN];
 23 bool SPFA(){
 24     for(int i=0;i<NV;++i){
 25         vis[i]=0;
 26         d[i]=INF;
 27     }
 28     vis[vs]=1;
 29     d[vs]=0;
 30     queue<int> que;
 31     que.push(vs);
 32     while(!que.empty()){
 33         int u=que.front(); que.pop();
 34         for(int i=head[u]; i!=-1; i=edge[i].next){
 35             int v=edge[i].v;
 36             if(edge[i].cap && d[v]>d[u]+edge[i].cost){
 37                 d[v]=d[u]+edge[i].cost;
 38                 pre[v]=i;
 39                 if(!vis[v]){
 40                     vis[v]=1;
 41                     que.push(v);
 42                 }
 43             }
 44         }
 45         vis[u]=0;
 46     }
 47     return d[vt]!=INF;
 48 }
 49 int MCMF(){
 50     int res=0;
 51     while(SPFA()){
 52         int flow=INF,cost=0;
 53         for(int u=vt; u!=vs; u=edge[pre[u]].u){
 54             flow=min(flow,edge[pre[u]].cap);
 55         }
 56         for(int u=vt; u!=vs; u=edge[pre[u]].u){
 57             edge[pre[u]].cap-=flow;
 58             edge[pre[u]^1].cap+=flow;
 59             cost+=flow*edge[pre[u]].cost;
 60         }
 61         res+=cost;
 62     }
 63     return res;
 64 }
 65
 66 inline void in(int &ret){
 67     char c; ret=0;
 68     while(c=getchar(),c<'0'||c>'9');
 69     while(c>='0'&&c<='9') ret=ret*10+(c-'0'),c=getchar();
 70 }
 71 int n,m,R[22][22],G[22][22],B[22][22];
 72 int get(int r,int g,int b){
 73     vs=n*m+3; vt=vs+1; NV=vt+1; NE=0;
 74     memset(head,-1,sizeof(head));
 75     addEdge(n*m,vt,r,0);
 76     addEdge(n*m+1,vt,g,0);
 77     addEdge(n*m+2,vt,b,0);
 78     for(int i=0; i<n; ++i){
 79         for(int j=0; j<m; ++j){
 80             addEdge(vs,i*m+j,1,0);
 81             addEdge(i*m+j,n*m,1,abs(255-R[i][j])+G[i][j]+B[i][j]);
 82             addEdge(i*m+j,n*m+1,1,R[i][j]+abs(255-G[i][j])+B[i][j]);
 83             addEdge(i*m+j,n*m+2,1,R[i][j]+G[i][j]+abs(255-B[i][j]));
 84         }
 85     }
 86     return MCMF();
 87 }
 88 int main(){
 89     int t;
 90     in(t);
 91     for(int cse=1; cse<=t; ++cse){
 92         in(n); in(m);
 93         for(int i=0; i<n; ++i){
 94             for(int j=0; j<m; ++j){
 95                 in(R[i][j]); in(G[i][j]); in(B[i][j]);
 96             }
 97         }
 98         int ans=INF;
 99         if(n*m%3==0){
100             ans=min(ans,get(n*m/3,n*m/3,n*m/3));
101         }else if(n*m%3==1){
102             ans=min(ans,get(n*m/3+1,n*m/3,n*m/3));
103             ans=min(ans,get(n*m/3,n*m/3+1,n*m/3));
104             ans=min(ans,get(n*m/3,n*m/3,n*m/3+1));
105         }else{
106             ans=min(ans,get(n*m/3+1,n*m/3+1,n*m/3));
107             ans=min(ans,get(n*m/3+1,n*m/3,n*m/3+1));
108             ans=min(ans,get(n*m/3,n*m/3+1,n*m/3+1));
109         }
110         printf("Case %d: %d\n",cse,ans);
111     }
112     return 0;
113 }

转载于:https://www.cnblogs.com/WABoss/p/5364266.html

SCU3033 Destroying a Painting(最小费用最大流)相关推荐

  1. 乌鲁木齐网络赛J题(最小费用最大流模板)

    ACM ICPC 乌鲁木齐网络赛 J. Our Journey of Dalian Ends 2017-09-09 17:24 243人阅读 评论(0) 收藏 举报  分类: 网络流(33)  版权声 ...

  2. POJ - 2516 Minimum Cost 最小费用最大流

    题目链接 题意:给n,m,k表示商店数,储存店数,种类数 然后给n*k表示每个水果店需求每种种类的数量: 表示成 need[i][j] 再给m*k表示每个储存店每种种类数量: 表示成store[i][ ...

  3. pku The Windy's KM最小权匹配 or 最小费用最大流

    http://poj.org/problem?id=3686 题意: 给定n个玩具,有m个车间,给出每个玩具在每个车间的加工所需的时间mat[i][j]表示第i个玩具在第j个车间加工所需的时间,规顶只 ...

  4. c语言最小费用流_策略算法工程师之路-图优化算法(一)(二分图amp;最小费用最大流)...

    目录 1.图的基本定义 2.双边匹配问题 2.1 二分图基本概念 2.2 二分图最大匹配求解 2.3 二分图最优匹配求解 2.4 二分图最优匹配建模实例 2.4.1 二分图最优匹配在师生匹配中的应用 ...

  5. 有源汇上下界最小费用可行流 ---- P4553 80人环游世界(拆点 + 有源汇上下界最小费用可行流)

    题目链接 题目大意: 解题思路: 又是一道裸题 . 首先它要求第iii个点只经过ViViVi那么我们就拆点ai,ai+na_i,a_{i+n}ai​,ai+n​一个点为入点,一个为出点这条边的流量范围 ...

  6. 有源汇上下界最小费用可行流 ---- P4043 [AHOI2014/JSOI2014]支线剧情(模板)

    题目链接 题目大意: 解题思路: 有源汇上下界最小费用可行流模板题目来着 先建出一个有源汇上下界可行流的图,然后注意建图的时候要把每条边的下界的费用提前加到ans里面 然后再对图跑费用流,就是补齐费用 ...

  7. Doctor NiGONiGO’s multi-core CPU(最小费用最大流模板)

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=693 题意:有一个 k 核的处理器和 n 个工作,全部的工作都须要在一个核上处理一个单位的 ...

  8. 【最小费用最大流】Going Home

    概念: 在同一个网络中,可能存在多个总流量相同的最大流,我们可以在计算流量的基础之上,给网络中的弧增加一个单位流量的费用(简称费用),在确保流量最大的前提下总费用最小--最小费用最大流. C - Go ...

  9. 最大流最小费用java_最小费用最大流及算法

    最大流的网络,可看作为辅送一般货物的运输网络,此时,最大流问题仅表明运输网络运输货物的能力,但没有考虑运送货物的费用.在实际问题中,运送同样数量货物的运输方案可能有多个,因此从中找一个输出费用最小的的 ...

最新文章

  1. emmmmmm(官宣?)
  2. 院士戴琼海:脑科学走向人工智能的重要路径
  3. 黑苹果 wifi android,动动手指零负担让你的黑苹果连上Wifi
  4. Linux 日志系统
  5. Android备份onedrive,三星Note10正将OneDrive集成到Android相册应用中
  6. mybatis plus关联查询_Mybatis 和 Hibernate 持久层框架之间的区别是啥?
  7. MDF /IDF名词解析
  8. 人人都该懂点儿TCP---ACK延缓(转)
  9. JS中图片缓冲loading技术的实例代码
  10. oracle中的代码在那里写,oracle中如何编写树级代码-数据库专栏,ORACLE
  11. 神经网络matlab仿真,MATLAB神经网络仿真与应用_IT教程网
  12. uint32_t 大小端转换
  13. 最新Java面试题,常见面试题及答案汇总
  14. http Headers字段汇总
  15. VSCode HTML文件 英文感叹号 ! + Tab 没有出现模板 解决方法
  16. Vue -脚手架的安装
  17. win7计算机里不显示摄像头,win7系统不显示摄像头的解决方法
  18. Android 通过 WebView 请求下载 APK
  19. 最新多屏群控技术---手机控制手机/苹果群控/IOS群控/实时同步操作群控功能讲解以及入门教程
  20. google search

热门文章

  1. ObjC: Foundation Kit
  2. 不同频率数据的处理方法V2
  3. 关于联合利华:我的第一次正式实习的单位!撒花!
  4. 腾讯最大规模裁撤中层干部,让贤年轻人
  5. mysqldump: Couldn't execute 'SAVEPOINT sp':
  6. RFID助力汽车零部件厂商识别冲压工具位置
  7. 标本兼治:企业应揪出网络漏洞元凶
  8. shell基础之if语句
  9. 使用parted命令对硬盘进行操作
  10. tomcat下manager配置