这意味着更复杂的问题,关键的事实被抽象出来:每个点,能够赋予既有的值(挑两个一。需要选择,设定ai,bi)。

寻找所有和最大。有条件:如果两个点同时满足:

1,:二进制只是有一个不同之处。  2:中的至少一个被选择B值。 则可获得相应加成。

这题開始想了半天,建图遇到问题。看了官方说是最小割。于是入手:

a值就是小于阈值的最大值,B值就是大于等于的最大值。

思路:俩个点选其一。必定想到建二分(每一个点一分为二)图。中间连无穷的边。由于仅仅有一位不同,必定分奇偶点,有奇数个1的点,源点到他为A值,相应点到汇点为B值。偶点相反。然后以下奇点向偶点中仅仅有一位不同的点连边,为(ui^uj)。理由:先全部值都取,舍去最小割,便是答案。当都选A值的时候。那么附加的值就不能取了。必是要成为割边,这也是分奇数偶数连发不同的原因,这恰好把同側的关系分到异側了。题目仅仅要方案。不要最值。有负数,先都加2014.  ans=全部权之和-最小割-n*1024。

#include<iostream> //15MS
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
int n,m,nn,mm,ss,tt;
const int inf=0x3f3f3f3f;
const int maxn=1025,maxe=780000;
int rge[maxn];int ui[maxn];
int a[maxn][maxn];
struct xy
{int low,high;
};
xy dian[maxn];
int head[maxn];int nume=0;int e[maxe][3];
void inline adde(int i,int j,int w)
{e[nume][0]=j;e[nume][1]=head[i];head[i]=nume;e[nume++][2]=w;e[nume][0]=i;e[nume][1]=head[j];head[j]=nume;e[nume++][2]=0;
}
int has1(int i)
{int ant=0;while(i){if(i&1)ant++;i=(i>>1);}return ant;
}
void build()
{for(int i=0;i<nn;i++){adde(i+1,i+nn+1,inf);if(has1(i)&1){if(dian[i].low!=-1)adde(ss,i+1,a[i][dian[i].low]);else{adde(ss,i+1,0);}adde(i+nn+1,tt,a[i][dian[i].high]);for(int j=0;j<nn;j++){if(has1(j^i)==1){adde(i+1,1+j+nn,ui[i]^ui[j]);}}}else{if(dian[i].low!=-1)adde(i+nn+1,tt,a[i][dian[i].low]);else{adde(i+nn+1,tt,0);}adde(ss,i+1,a[i][dian[i].high]);}}
}
int vis[maxn];int lev[maxn];
bool bfs()
{for(int i=0;i<tt+2;i++)lev[i]=vis[i]=0;queue<int>q;q.push(ss);vis[ss]=1;while(!q.empty()){int cur=q.front();q.pop();for(int j=head[cur];j!=-1;j=e[j][1]){int v=e[j][0];if(!vis[v]&&e[j][2]>0){vis[v]=1;lev[v]=lev[cur]+1;q.push(v);}}}return vis[tt];
}
int dfs(int cur,int minf)
{if(cur==tt||minf==0)return minf;int sumf=0,f;for(int j=head[cur];j!=-1&&minf;j=e[j][1]){int v=e[j][0];if(lev[v]==lev[cur]+1&&e[j][2]>0){f=dfs(v,e[j][2]<minf?

e[j][2]:minf); minf-=f;sumf+=f; e[j][2]-=f;e[j^1][2]+=f; } } if(!sumf) lev[cur]=-1; return sumf; } int dinic() { int sums=0; while(bfs()) { sums+=dfs(ss,inf); } return sums; } void init() { scanf("%d%d",&n,&m); nn=(1<<n),mm=(1<<m); ss=0,tt=2*nn+1; for(int i=0;i<=tt+1;i++) { head[i]=-1; } nume=0; for(int i=0;i<nn;i++) scanf("%d",&rge[i]); for(int i=0;i<nn;i++) scanf("%d",&ui[i]); for(int i=0;i<nn;i++) for(int j=0;j<mm;j++) { scanf("%d",&a[i][j]); a[i][j]+=1024; } for(int i=0;i<nn;i++) { dian[i].low=-1; int max1=0,max2=0; for(int j=0;j<rge[i];j++) { if(a[i][j]>max1){max1=a[i][j];dian[i].low=j;} } for(int j=rge[i];j<mm;j++) { if(a[i][j]>max2){max2=a[i][j];dian[i].high=j;} } } } int main() { int T; scanf("%d",&T); while(T--) { init(); build(); dinic(); for(int i=1;i<nn;i++) if(vis[i]&&(has1(i-1)&1)||!vis[i]&&!(has1(i-1)&1)) printf("%d ",dian[i-1].low); else printf("%d ",dian[i-1].high); if(vis[nn]&&(has1(nn-1)&1)||!vis[nn]&&!(has1(nn-1)&1)) printf("%d\n",dian[nn-1].low); else printf("%d\n",dian[nn-1].high); } return 0; }

版权声明:本文博客原创文章,博客,未经同意,不得转载。

hdu 5076 最小割灵活运用相关推荐

  1. hdu 3046(最小割)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3046 思路:最小割的入门题,设源点为0,汇点为n*m+1,源点与点为2的连一天容量为inf的边,汇点与 ...

  2. hdu 3987(最小割的边数)

    题意:给出一张有n个点的图,有的边又向,有的边无向,现在要你破坏一些路,使得从点0无法到达点n-1.破坏每条路都有一个代价.求在代价最小的前提下,最少需要破坏多少条道路.(就是说求在最小割的前提下,最 ...

  3. hdu 3046(最小割最大流)

    题意:在一个单位方格边长为1的矩阵中藏着灰太狼和它的同伴,等待着喜羊羊和它的同伴,为了不让喜羊羊和同伴被抓住,我们可以在矩形草坪中设置单位长度为1的栅栏,求最短的栅栏长度. 解题思路:这道题是要把狼和 ...

  4. hdu 3879(最小割模型求解最大权闭合图)

    题意: 公司得到了一共N个可以作为通讯信号中转站的地址,而由于这些地址的地理位置差异,在不同的地方建造通讯中转站需要投入的成本也是不一样的,所幸在前期调查之后这些都是已知数据:建立第i个通讯中转站需要 ...

  5. hdu 4289(最小割最大流定理)

    题意:有N个城市,现在城市S出现了一伙歹徒,他们想运送一些炸弹到D城市,不过警方已经得到了线报知道他们的事情,不过警察不知道他们所在的具体位置,所以只能采取封锁城市的办法来阻断暴徒,不过封锁城市是需要 ...

  6. 【HDU】4859 海岸线 黑白染色+最小割

    传送门:[HDU]4859 题目分析: 最小割的思想真是博大精深! 本题的模型是最小割. 我们需要最大化海岸线的长度,如果相邻两点属性不同才会存在海岸线(海和陆地),所以我们可以将题目转化成最小化不是 ...

  7. HDU 4859 海岸线 最小割

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4859 题解: 这题考察的是最小割. 我们可以这样想:海岸线的长短变化都是E引起的,我们通过把'E'变 ...

  8. 【最小割】HDU 3987 Harry Potter and the Forbidden Forest

    得到的最小割得到sum sum/E 为 最小割 sum%E 为最小割的边数 #include <stdio.h> #include <string.h> #include &l ...

  9. HDU 3046 Pleasant sheep and big big wolf 最小割

    题意: 给定n*m个点的矩阵 0为空点.1为羊.2为狼 相邻点之间有一条路. 问要使得狼与羊不连通最少要去掉几条边 最小割 #include<stdio.h> #include<st ...

最新文章

  1. Yolov4性能分析(上)
  2. Flume Sinks官网剖析(博主推荐)
  3. 最详细的JavaWeb开发基础之java环境搭建(Windows版)
  4. 3、将对象存储到zookeeper中,然后再拿下来还原
  5. Android Binder Driver缺陷导致定屏问题分析
  6. STL的forward_list链表
  7. C#操作HttpClient工具类库
  8. Codeforces Round #413 C-Fountains 树状数组
  9. java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.String
  10. bzoj1601 灌水
  11. 带参数的插入语句的问题
  12. 中国金融出版社出版的2016版《综合》
  13. jmeter throughput图表_jmeter生成HTML格式性能测试报告
  14. 文华赢顺显示连接服务器失败,文华财经赢顺云本机已被系统限制登陆修复工具...
  15. 微软模拟飞行10厦门航空涂装_微软飞行模拟IGN 评测 10 分:一个任你翱翔的自由世界...
  16. Android 水瓶动画,贝塞尔Loading
  17. 如何让计算机从固态硬盘启动不了,电脑设置固态硬盘启动的方法
  18. ARToolKit在visual studio2013(win10)的环境配置
  19. 写给产品经理的12封信(第07封:学习能力)
  20. 超过心跳间隔的客户端重连接导致额外的License消耗

热门文章

  1. 4008-基于邻接矩阵的新边的增加(C++,附思路)
  2. 两个有序链表序列的合并
  3. php的crypt,php使用crypt()函数进行加密
  4. 宝塔 php5.6 极速安装_cltphp5.6.6版本安装教程-宝塔练手
  5. python framework threads_python 多线程,进程的理解
  6. C#图解教程 第十三章 委托
  7. Python-进程相关概念
  8. 解决JAVA_HOME nor the JRE_HOME environment variable is defined
  9. 学习笔记25_MVC前台API
  10. [原创]java WEB学习笔记71:Struts2 学习之路-- struts2常见的内建验证程序及注意点,短路验证,非字段验证,错误消息的重用...