spoj839 Optimal Marks(最小割,dinic)

题目大意:

给你一个无向图\(G(V,E)\)。 每个顶点都有一个int范围内的整数的标记。 不同的顶点可能有相同的标记。
对于边\((u,v)\),我们定义\(Cost(u,v)=mark [u]\ \ xor\ \ mark [v]\)
现在我们知道某些节点的标记了。你需要确定其他节点的标记,以使边的总成本尽可能小。
最后要求输出的每个点的标号

QwQ一看到这种跟位运算有关题目,就会想到按位来处理

仔细考虑,发现这个题满足最小割的模型,对于每一位,当时将所有点的对应位分成0,或者是1

那么,我们按位来,假设当前位是\(i\),对于已经知道编号的点\(x\),如果当前位是1的话,我们\(insert(s,x,inf)\),否则\(insert(x,t,inf)\)表示,这个点是0还是1,同时inf的原因是给定的点的编号的不能改的
同时对于原图的边\(u->v\),我们只需要\(insert(u,v,1),insert(v,u,1)\) 表示这两个点的当前位是否相同,最后跑\(dinic\),剩下的残余网络中,与s相连,且沿途流量\(>0\)的,就是1,否则就是0

大致就是这样,最后千万别忘记:
1.编号可能是0
2.初始化数组

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>using namespace std;inline int read()
{int x=0,f=1;char ch=getchar();while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;
}const int maxn = 1010;
const int maxm = 200010;
const int inf = 1e9;int point[maxn],nxt[maxm],to[maxm],val[maxm];
int h[maxn];
int num[maxn];
int ans[maxn];
int x[maxm],y[maxm];
int n,m,cnt=1;
int s,t;
int vis[maxn];
queue<int> q;void addedge(int x,int y,int w){nxt[++cnt]=point[x];to[cnt]=y;val[cnt]=w;point[x]=cnt;
}void init()
{cnt=1;memset(point,0,sizeof(point));memset(vis,0,sizeof(vis));
}void insert(int x,int y,int w)
{addedge(x,y,w);addedge(y,x,0);
}bool bfs(int s)
{memset(h,-1,sizeof(h));h[s]=0;q.push(s);while (!q.empty()){int x = q.front();q.pop();for (int i=point[x];i;i=nxt[i]){int p = to[i];if (val[i]>0 && h[p]==-1){h[p]=h[x]+1;q.push(p);}}}if (h[t]==-1) return false;else return true;
}int dfs(int x,int low)
{if (x==t || low==0) return low;int totflow=0;for (int i=point[x];i;i=nxt[i]){int p = to[i];if (val[i]>0 && h[p]==h[x]+1){int tmp = dfs(p,min(val[i],low));val[i]-=tmp;val[i^1]+=tmp;low-=tmp;totflow+=tmp;if (low==0) return totflow;}}if (low>0) h[x]=-1;return totflow;
}int dinic(){int ans=0;while (bfs(s)){ans+=dfs(s,inf);}
}void dfs1(int x,int d)
{vis[x]=1;ans[x]|=(1 << d); for (int i=point[x];i;i=nxt[i]){int p = to[i];if (!vis[p] &&val[i]>0){dfs1(p,d);}}   
}
void build(int xx)
{init();s=n+10;t=s+1; for (int i=1;i<=n;i++){if (num[i]!=-1){if (num[i] & (1<<xx)) insert(s,i,inf);else insert(i,t,inf);}}for (int i=1;i<=m;i++){insert(x[i],y[i],1);insert(y[i],x[i],1);}dinic();dfs1(s,xx);
}int T;
int main()
{scanf("%d",&T);while (T--){memset(num,-1,sizeof(num));memset(ans,0,sizeof(ans));init();n=read(),m=read();for (int i=1;i<=m;i++) x[i]=read(),y[i]=read();int k;k=read();for (int i=1;i<=k;i++){int oo;oo=read();num[oo]=read();}for (int i=0;i<=32;i++){build(i);}for (int i=1;i<=n;i++) printf("%d\n",ans[i]);}return 0;
}

转载于:https://www.cnblogs.com/yimmortal/p/10160835.html

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

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

相关文章

Hinton的胶囊网络不太行?CVPR Oral论文:不比卷积网络更「强」

来源&#xff1a;机器学习研究组订阅在一篇 CVPR 2021 Oral 论文中&#xff0c;来自慕尼黑大学、微软亚研的研究者对胶囊网络和卷积网络进行了全面的对比。一系列实验表明&#xff0c;一些被认为对胶囊网络&#xff08;CapsNet&#xff09;至关重要的设计组件实际上会损害它的鲁…

Python程序生成.exe的可执行文件

Python程序生成.exe的可执行文件 1&#xff09;编写生成exe的脚本程序setup.py #codingutf-8 #exe文件生成脚本 from distutils.core import setup import py2exe setup(console[test.py])#test.py为应用程序文件 2&#xff09;将应用程序test.py和脚本程序放在同一个文件夹下A…

数量庞大!中国成长型AI企业研究报告

来源&#xff1a;德勤Deloitte编辑&#xff1a;蒲蒲日前&#xff0c;德勤、英特尔和深圳人工智能行业协会联合发布《中国成长型AI企业研究报告》。该报告通过对数千家成长型AI企业数据的分析研究&#xff0c;几百家企业的走访以及和近百家优秀企业的深度合作&#xff0c;就中国…

Python+Selenium基础篇之2-打开和关闭火狐浏览器

本节介绍如何初始化一个webdriver实例对象driver&#xff0c;然后打开和关闭firefox浏览器。要用selenium打开fiefox浏览器。首先需要去下载一个driver插件geckodriver.exe&#xff0c; 下载地址https://github.com/mozilla/geckodriver/releases&#xff0c;下载好这个exe文件…

Oracle 数据库

Oracle 12c 数据库学习记录&#xff1a;study 1&#xff1a; 0.Oracle例程服务的启动net start oracleserviceorcl 1.查看数据库的初始化参数&#xff1a;通常登录sys用户&#xff1a;sqlplus / as sysdba&#xff1b;2. 查看内存方面的参数(模糊匹配)&#xff1a;show paramet…

除了芯片,我们还应关注这六大核心技术!

来源&#xff1a;疯狂机械控企业想发展自己还是需要掌握核心技术。除了芯片以外&#xff0c;还有哪些核心技术是我们重点关注的呢&#xff1f;01 软件定义机器▼设备智能化的体现就是典型的软件定义机器&#xff0c;包括机器轻松连接至互联网&#xff1b;将APP和分析结果嵌入机…

matlab技巧

%matlab 编程技巧 %% 1,调试过程中&#xff0c;不能有clear all语句&#xff0c;该语句会清除断点%% 2.通过tic和toc来计算某块代码的执行时间 tic for i1:1000xx1 end timetoc%% 3.图像对象和句柄 %1.设置线条的属性 x0:0.01:10; hplot(x,x.*sin(cos(x)))%h为曲线的句柄 grid …

MySQL GROUP BY 语句

GROUP BY 语句根据一个或多个列对结果集进行分组。 在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。 GROUP BY 语法 SELECT column_name, function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name; 1.group by 可以实现一个最简单的…

中国科学院院士褚君浩:第四次工业革命和智能时代

来源&#xff1a;信息化时代第一次工业革命起源于英国&#xff0c;以机械化为特征。第二次工业革命&#xff0c;以电气化为特征。第三次工业革命&#xff0c;以信息化为特征。现阶段&#xff0c;正值第四次工业革命&#xff0c;此次工业革命具有以下三个特征&#xff1a;信息科…

数据的描述统计量

一、本文简介   一组样本数据分布的数值特诊可以从三个方面进行描述&#xff1a; 1、数据的水平&#xff1a;也称为集中趋势或位置度量&#xff0c;反应全部数据的数值大小。 2、数据的差异&#xff1a;反应数据间的离散程度。 3、分布的形状&#xff1a;反应数据分布的偏度和…

Science:细胞如何测量自身的大小?答案是:DNA含量

图片显示的是一个茎尖分生组织(在中间)&#xff0c;在它的两侧出现了花蕾。绿色标记的细胞即将进入DNA复制。来源&#xff1a;生物通自从350多年前科学家在显微镜下发现细胞以来&#xff0c;他们就注意到每一种细胞都有其特有的大小。从微小的细菌到几英寸长的神经元&#xff0…

Windows 程序设计技巧

#include<iostream> #include<windows.h>using namespace std;int main() {int nSelect ::MessageBox(NULL,"windows 程序设计","测试",MB_OKCANCEL);if (nSelect IDOK){printf("OK!");}else{printf("Cancel!");}return…

洛谷P1558 色板游戏

题目背景 阿宝上学了&#xff0c;今天老师拿来了一块很长的涂色板。 题目描述 色板长度为\(L\)&#xff0c;\(L\)是一个正整数&#xff0c;所以我们可以均匀地将它划分成\(L\)块\(1\)厘米长的小方格。并从左到右标记为\(1, 2, ... L\)。 现在色板上只有一个颜色&#xff0c;老师…

兰德公司发布《美国5G时代》报告

来源&#xff1a;微信公众号科技咨询频道作者&#xff1a;谢黎、张志强&#xff0c;中国科学院成都文献情报中心兰德公司2021年5月24日发布《美国5G时代&#xff1a;在保障国家和人民的同时获得竞争优势》报告。报告援引美国国防创新委员会、联邦政府的观点&#xff0c;声称5G是…

7-3 银行排队问题之单队列多窗口服务 (25 分)

7-3 银行排队问题之单队列多窗口服务 (25 分) 假设银行有K个窗口提供服务&#xff0c;窗口前设一条黄线&#xff0c;所有顾客按到达时间在黄线后排成一条长龙。当有窗口空闲时&#xff0c;下一位顾客即去该窗口处理事务。当有多个窗口可选择时&#xff0c;假设顾客总是选择编号…

Win32 程序运行原理

处理器的3工作方式&#xff1a;实模式&#xff0c;保护模式&#xff0c;虚拟86模式。CPU的主要工作在保护模式下。Windows操作系统就是运行在保护模式下的&#xff1b;Windows多任务的实现&#xff1a;任务间的切换提供了良好条件&#xff0c;多任务隔离&#xff0c;每个任务都…

40年诞生7位诺奖得主,美国贝尔实验室做对了什么?

贝尔实验室从1940年到1979年&#xff0c;共40年&#xff0c;历经4位总裁。这4位总裁在不同时期根据当时的形势&#xff0c;都提出了自己的管理方针&#xff0c;领导着该实验室近万名工作人员和几千名的科学家和工程师为世界和美国的科技发展作出了重要的贡献。来源&#xff1a;…

图书管理销售系统需求分析报告,对性能的规定以及运行环境规定部分

负责人&#xff1a;皮皮周(20160401085) 国字号(20160401105 完成工作&#xff1a; 3.3对性能的规定3.3.1精度 软件的输入精度:如果输入为数字,小数点后保留2位有效数字;如果输入为字符串,其长度限定为16位。 输出数据精度的要求: 如果输出为数字,小数点后保留…

7-4 堆栈模拟队列 (25 分)

7-4 堆栈模拟队列 (25 分) 设已知有两个堆栈S1和S2&#xff0c;请用这两个堆栈模拟出一个队列Q。 所谓用堆栈模拟队列&#xff0c;实际上就是通过调用堆栈的下列操作函数: int IsFull(Stack S)&#xff1a;判断堆栈S是否已满&#xff0c;返回1或0&#xff1b; int IsEmpty (…

H5唤醒app,不完全兼容

---ps---最近新发现一个开源的H5唤醒app的库&#xff1a;建议使用第三方开源库https://github.com/suanmei/callapp-lib实现&#xff1b;或者极光魔链&#xff08;后期可能会收费&#xff09;https://www.cnblogs.com/SimonHu1993/p/10578775.html<script type"text/ja…