SPOJ-OPTM Optimal Marks ★★(按位建图 最小割)

题意】给出一个无向图,每个点有一个标号mark[i],不同点可能有相同的标号。对于一条边(u, v),它的权值定义为mark[u] xor mark[v]。现在一些点的标号已定,请决定剩下点的标号,使得总的边权和最小。(0 < N <= 500, 0 <= M <= 3000, 0 <= mark[i] <= 2^31-1) 胡伯涛神牛《最小割模型在信息学竞赛中的应用》中的例题。非常好的一道题!非常推荐! 【思路】 我们把问题数学化就是:  Minimum  sigma(we) = sigma(u, v)∈E ( mark(u) xor mark(v) ) 对于异或问题,我们发现这样的二进制按位运算各个二进制位之间是互不影响的,所以我们可以一位一位的做这类题。 那么我们的式子又可以进一步转化为: Minimum  sigma(u, v)∈E { sigmai=0~oo(2^i) • sigma(mark(u, i) xor mark(v, i)) } 这样我们就把mark的限制加强了:只可能是0或1。即这些点将分成两类。 再观察我们发现,xor运算,只有当u、v不同时结果才为1,即这样的有效边的两端点一定属于不同点集。这像什么?不就是割边嘛!~而题目正好又是要求最小,这样问题便转化为最小割了~    (要注意培养这种问题转化和模型发现的能力!) 那么具体的最小割网络GN模型:建一个源点,向每一个标号为1的点连一条oo流量的边(后面解释为什么源点连标号1的点);建一个汇点,向每一个标号为0的点连一条oo流量的边;原图中的边容量设为1加入到GN中。求出来的最小割便是该二进制位下的标号xor的和最小的情况。 然而题目还要求输出所有点的标号,并且需要标号的和也最小。那么怎么保证标号的和最小呢?无非就是尽可能的取0。那么又该怎么做? 首先先看怎么给那些未标号的点标号:容易想到最小割把网络分成了两个点集,那么显然每个点标号应该和它所在点集已标号的点一致,所以当然希望标号为0的点集点更多一些。然后注意我们划分点集是从源点开始dfs,那么这样划出来的最小割边集显然更偏向源点,即这样划分出来的S集点是最少的。于是源点当然连标号为1的点呐~ 【代码】  

#include 
#include 
#include 
#include 
#include 
#include 
#define MID(x,y) ((x+y)/2)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int MAXV = 505;
const int MAXE = 10005;
const int oo = 0x3fffffff;/* Dinic-2.0-2013.07.21: adds template.  double & int 转换方便多了,也不易出错 ~*/
template 
struct Dinic{struct node{int u, v;T flow;int opp;int next;}arc[2*MAXE];int vn, en, head[MAXV];int cur[MAXV];int q[MAXV];int path[2*MAXE], top;int dep[MAXV];void init(int n){vn = n;en = 0;mem(head, -1);}void insert_flow(int u, int v, T flow){arc[en].u = u;arc[en].v = v;arc[en].flow = flow;arc[en].next = head[u];head[u] = en ++;arc[en].u = v;arc[en].v = u;arc[en].flow = 0;arc[en].next = head[v];head[v] = en ++;}bool bfs(int s, int t){mem(dep, -1);int lq = 0, rq = 1;dep[s] = 0;q[lq] = s;while(lq < rq){int u = q[lq ++];if (u == t){return true;}for (int i = head[u]; i != -1; i = arc[i].next){int v = arc[i].v;if (dep[v] == -1 && arc[i].flow > 0){dep[v] = dep[u] + 1;q[rq ++] = v;}}}return false;}T solve(int s, int t){T maxflow = 0;while(bfs(s, t)){int i, j;for (i = 1; i <= vn; i ++)  cur[i] = head[i];for (i = s, top = 0;;){if (i == t){int mink;T minflow = 0x3fffffff;for (int k = 0; k < top; k ++)if (minflow > arc[path[k]].flow){minflow = arc[path[k]].flow;mink = k;}for (int k = 0; k < top; k ++)arc[path[k]].flow -= minflow, arc[path[k]^1].flow += minflow;maxflow += minflow;top = mink;i = arc[path[top]].u;}for (j = cur[i]; j != -1; cur[i] = j = arc[j].next){int v = arc[j].v;if (arc[j].flow && dep[v] == dep[i] + 1)break;}if (j != -1){path[top ++] = j;i = arc[j].v;}else{if (top == 0)   break;dep[i] = -1;i = arc[path[-- top]].u;}}}return maxflow;}
};
Dinic  dinic;
int mark[MAXV];
bool if_mark[MAXV];
struct path{int u, v;
}p[MAXE];
bool vis[MAXV];
int st[MAXV];   //ST集
void dfs(int u){vis[u] = 1;st[u] = 1;for (int i = dinic.head[u]; i != -1; i = dinic.arc[i].next){if (dinic.arc[i].flow <= 0) continue;int v = dinic.arc[i].v;if (!vis[v]){dfs(v);}}return ;
}
int main(){int t;scanf("%d", &t);while(t --){int n, m;scanf("%d %d", &n, &m);for (int i = 1; i <= m; i ++){scanf("%d %d", &p[i].u, &p[i].v);}int k;mem(mark, 0);mem(if_mark, false);scanf("%d", &k);int maxn = 0;for (int i = 0; i < k; i ++){int u;scanf("%d", &u);scanf("%d", &mark[u]);maxn = max(maxn, mark[u]);if_mark[u] = true;}int oi = ceil(log(maxn)/log(2));for (int k = 0; k < oi; k ++){dinic.init(n+2);for (int i = 1; i <= n; i ++){if (!if_mark[i])continue;if ((mark[i] & (1 << k))){dinic.insert_flow(n+1, i, oo);}else{dinic.insert_flow(i, n+2, oo);}}for (int i = 1; i <= m; i ++){dinic.insert_flow(p[i].u, p[i].v, 1);dinic.insert_flow(p[i].v, p[i].u, 1);}dinic.solve(n+1, n+2);mem(st, 0);mem(vis, 0);dfs(n+1);       //残留网络中dfs确定点S、T集for (int i = 1; i <= n; i ++){if (st[i] == 1 && !if_mark[i]){mark[i] += (1 << k);}}}for (int i = 1; i <= n; i ++){printf("%d\n", mark[i]);}}return 0;
}

转载于:https://www.cnblogs.com/AbandonZHANG/p/4114052.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460915.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第七季1:分析MP4文件封装格式

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 参考内容 &#xff08;1&#xff09;mp4文件格式解析 - nigaopeng - 博客园&#xff08;推荐&#xff09; &#xff08;2&#xff09;你真的懂 MP4 格式吗&#xff1f; &#xff08;3&#xff09;m…

ESXi主机管理内存资源的方式

因为内存通常是最有限的资源&#xff0c;ESXi采用内存过量配置&#xff08;Memory overcommitment&#xff0c;即配置后的虚拟机内存可能超过物理内存&#xff08;RAM&#xff09;&#xff09;对内存进行管理。使用内存过量配置时&#xff0c;ESXi必须使用技术从一个或多个VM中…

第七季2:移植MP4v2库 与 将H.264码流打包成MP4格式的文件

以下内容源于朱有鹏课程的学习与整理&#xff0c;如有侵权请告知删除。 前言 本文首先移植MP4V2库&#xff0c;然后运行修改后的sample代码以生成MP4文件。 利用MP4v2库&#xff0c;可以将编码方式为H264的视频码流打包、封装为MP4格式的文件。 一、移植MP4v2库 1、下载MP4…

新高考不选物理可以学计算机吗,新高考选科中物理真的那么重要吗?没有选物理是不是完了?...

文/圆梦志愿 伏老师众所周知&#xff0c;选科是我国新高考中最重要的事情之一&#xff0c;且涉及到了多门选考科目。其中&#xff0c;要数物理的话题性相对最强。那么&#xff0c;高考选科是不是物理特别重要&#xff1f;新高考没有选物理是不是完了&#xff1f;一、高考选科是…

参加第三届信息化创新克拉玛依国际学术论坛

据老孙说前二届在克拉玛依的数字油田的会议规格很高&#xff0c;可惜一直没机会参加。2014年9月3日至4日举办第三届&#xff0c;无论如何抓住了这次机会&#xff0c;不过会议的内容有些让我失望&#xff0c;克拉玛依的心思已经放在数字城市上了&#xff0c;数字油田的主题被冲淡…

UNICODE,GBK,UTF-8区别

简 单来说&#xff0c;unicode&#xff0c;gbk和大五码就是编码的值&#xff0c;而utf-8,uft-16之类就是这个值的表现形式&#xff0e;而前面那三种编码是一兼容的&#xff0c;同一个汉字&#xff0c; 那三个码值是完全不一样的&#xff0e;如&#xff02;汉&#xff02;的unco…

学生使用计算机中怎么关机,学会正确开关机初中计算机教案

第1篇&#xff1a;学会正确开关机初中计算机教案学会正确开、关机教案教学目的和要求学会开、关机教学难点&#xff1a;1、了解计算机外设的开、关顺序2、正确学会开、关机教学准备&#xff1a;计算机、网络教学过程()&#xff1a;一、教学导入同学们&#xff0c;在你们面前看到…

Telnet远程登录 与 海思proc文件系统

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c; 如有侵权请告知删除。 内容总结 &#xff08;1&#xff09;添加“ telnet远程登录 ”这种调试方式。 &#xff08;2&#xff09;介绍“ 海思proc文件系统 ”这种调试接口。 一、telnet远程登录 1、telnet远程登录的意…

北邮-上机-提交错误解决及一些经验

2019独角兽企业重金招聘Python工程师标准>>> 1、出现Time Limit Exceed问题 答&#xff1a;三种原因&#xff1a;1、程序死循环或太多的循环&#xff1b;2、对极限状况计算量太大&#xff0c;需要优化程序&#xff0c;如对10000个以上进行排序必须使用快速排序&…

study notes for python

some useful materials Python完全新手教程 http://www.cnblogs.com/taowen/articles/11239.aspx (from taowen, BITer) Note: Part 1 Basic Data Structure List, Dict(dictionary) and Turple are three main data structures in python, which are respond to set,mapping a…

html如何制作滑块,网页制作html5实现滑块功能之type=quot;rangequot;属性-建站-建站教程-建站方法-米云建站 - 米云问答...

html5实现滑块功能之type"range"属性1.html5中添加了关于滑块的标签,其实际是扩展了input标签,type属性值为range。2.感觉挺有意思,就做了一个关于滑块的动画的例子&#xff0c;可以通过开始和结束按钮来控制滑块的滑动和停止&#xff0c;有点类似视频的自动播放和暂…

第七季3:分析“将H.264码流打包成MP4格式的文件”的源码

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 前言 “将H.264MP4码流打包成MP4格式文件”的实验&#xff0c;见博文第七季2&#xff1a;MP4v2库的移植与播放实战。 接下来我们将对相关的源码进行分析。建立SI工程&#xff0c;导入sample_mp4_…

什么代码才是线程安全的

转自&#xff1a;http://www.cnblogs.com/lidabo/archive/2013/04/10/3011518.html 对于多线程编程&#xff0c;很多人概念不清&#xff0c;写代码的时候要么是处处加锁&#xff0c;影响性能不说&#xff0c;还容易莫名其妙的死锁&#xff0c;还有人对多线程敬而远之。所以学习…

百度富文本编辑器的应用技巧---在一个页面中使用多个样式不同功能不同的编辑器...

//1.2.4以后可以使用一下代码实例化编辑器 //UE.getEditor(myEditor)在官方的说明文档上看到这个注释&#xff0c;不是很明白&#xff0c;而且需要在一个页面中使用多次样式功能不同的ueditor&#xff0c;经过多次测试&#xff0c;终于成功自定义功能。代码如下<form><…

计算机基础知识复习题,计算机基础知识理论复习题及答案.doc

《计算机基础知识理论复习题及答案.doc》由会员分享&#xff0c;提供在线免费全文阅读可下载&#xff0c;此文档格式为doc&#xff0c;更多相关《计算机基础知识理论复习题及答案.doc》文档请在天天文库搜索。1、&#xfeff;基础知识复习题及答案一、 选择题1. 第三代计算机所…

RAM、ROM和FLASH三大类常见存储器简介

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 参考博客&#xff1a; Flash、RAM、ROM的区别_天籁东东的博客-CSDN博客_flash和rom的区别 RAM、ROM和FLASH三大类常见存储器简介 - 存储技术 - 电子发烧友网 RAM、NANDFlash、NORFlash的区别详解 - 百度…

SHELL中的IF判断 ​

SHELL中的IF判断shell中if做比较比较两个字符串是否相等的办法是&#xff1a;if [ "$test"x "test"x ]; then这里的关键有几点&#xff1a;1 使用单个等号2 注意到等号两边各有一个空格&#xff1a;这是unix shell的要求3 注意到"$test"x最后的…

wangeditor html编辑,Vue整合wangEditor富文本编辑器

最近在做项目时&#xff0c;客户有个发布新闻动态的功能&#xff0c;具体页面内容让客户自己编写&#xff0c;所以要选择富文本编辑器&#xff0c;这样用户体验好一点。网上有很多的富文本编辑器&#xff0c; 因为项目的功能并不是很复杂&#xff0c;所以选择了wangEditor&…

SqlSever分页查询,仅扫描一次表

数据库的分页查询一般由两个查询组成&#xff1a; select count(*) from Goods 和 select * from (select row_number() over(order by goodsId) as rowid, *from Goods ) as a where rowid > pageSize * (pageIndex - 1) 1 and rowid < pageSize * pageIndex 第一个查询…

嵌入式基础认识2:shell脚本的一些简单语法规则

一、关于shell的一些认识 1、shell语言&#xff0c;是一类编程语言。常用shell语言有sh、bash、csh、ksh、perl、python等。linux下最常用的脚本就是bash。 2、shell脚本&#xff0c;即把在命令行中输入的命令写成程序。这样可以避免反复地在命令行下手工输入命令的繁琐工作。…