JZYZOJ1349 SPOJ839 星屑幻想 xor 网络流 最大流
http://172.20.6.3/Problem_Show.asp?id=1349
调了两个小时发现数组开小了[doge]。
题意:给出几个点,有的点的权值确定,连接两点的边的权值为两点值的异或和,求所有边权值的和最小的点权值的方案(若有多种方案,输出点的权值和最小的方案)。
不严谨的方案证明(严谨的方案应该和最小割有关):首先,当每个未知权值的点只与几个已知权值的点相连时,显然这个点二进制的每一位都取这些相连的权值中此位最多的,以争取到更多的此位为0。
因为要求输出点的权值也尽量小,所以当某一位相连的0和1相等时,这一位取0。
这种方案可以扩展到那些连接有未知权值点的未知权值点,此时问题就可以按位用网络流求解出最小方案的二进制每一位从而求出数。
计算到某一位时,
s向所有确定权值的该位为1的点连一条权值为无穷的有向边,
所有确定权值的该位为0的点向t连一条权值为无穷的有向边,
题目中相连的边都为权值为1的无向边,
然后从s向t网络流,结束后连1多的点到s有 所有边的权值都大于0的一条路 ,否则没有,据此求出该位。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
const int maxn=;
const long long inf=100000000000000000LL;
long long n,m;
long long val[maxn];
struct cu{
long long x,y;
}a[maxn*];
struct nod{
long long y,v,next;
}e[maxn*];
long long head[maxn]={},tot=;
bool vis[maxn]={};
long long ans[maxn]={};
long long dep[maxn]={};
void insert(long long x,long long y,long long v1,long long v2){
e[++tot].y=y;e[tot].next=head[x];e[tot].v=v1;head[x]=tot;
e[++tot].y=x;e[tot].next=head[y];e[tot].v=v2;head[y]=tot;
}
bool bfs(long long s,long long t){
queue<long long>q;while(!q.empty())q.pop();
memset(dep,,sizeof(dep));
q.push(s);q.push(s);dep[s]=;long long x,y,v;
while(!q.empty()){
x=q.front();q.pop();
for(int i=head[x];i;i=e[i].next){
y=e[i].y;v=e[i].v;
if(v>&&!dep[y]){
dep[y]=dep[x]+;q.push(y);
}
}
}
return dep[t];
}
long long dfs(long long x,long long t,long long mi){
if(x==t||mi==)return mi;
long long y,v,tsn=,z;
for(int i=head[x];i;i=e[i].next){
y=e[i].y;v=e[i].v;
if(v>&&dep[y]==dep[x]+){
z=dfs(y,t,min(mi-tsn,v));
e[i].v-=z;e[i^].v+=z;
tsn+=z;
if(tsn==mi)return tsn;
}
}
return tsn;
}
void dinic(long long s,long long t){
while(bfs(s,t)){
dfs(s,t,inf);
}
}
void dra(long long x,long long v){
long long y;vis[x]=;ans[x]+=v;
for(int i=head[x];i;i=e[i].next){
y=e[i].y;
if(e[i].v>&&!vis[y]){
dra(y,v);
}
}
}
void doit(){
long long v=,s=n+,t=n+;
for(;;){
memset(vis,,sizeof(vis));
memset(head,,sizeof(head));tot=;
for(int i=;i<=m;i++){
insert(a[i].x,a[i].y,,);
}int f=;
for(int i=;i<=n;i++){
if(val[i]!=-){
if(val[i]>)f=;
if(val[i]%)insert(s,i,inf,);
else insert(i,t,inf,);
val[i]/=;
}
}
if(!f)break;
dinic(s,t);
dra(s,v);
v*=;
}
for(int i=;i<=n;i++){
printf("%I64d\n",ans[i]);
}
}
int main(){
//freopen("wtf.in","r",stdin);
scanf("%I64d%I64d",&n,&m);
for(int i=;i<=m;i++){
scanf("%I64d%I64d",&a[i].x,&a[i].y);
}long long k,x,y;scanf("%I64d",&k);memset(val,-,sizeof(val));
for(int i=;i<=k;i++){
scanf("%I64d%I64d",&x,&y);val[x]=y;
}doit();
return ;
}
JZYZOJ1349 SPOJ839 星屑幻想 xor 网络流 最大流的更多相关文章
- 星屑幻想 optimal mark
LINK :SP839 星屑幻想 取自 OJ 的名称 小事情...题目大意还是要说的这道题比较有意思,想了一段时间. 给你一张图 这张图给答案带来的贡献是每条边上两个点值得异或 一些点的值已经被确定 ...
- POJ 1459-Power Network(网络流-最大流-ISAP)C++
Power Network 时间限制: 1 Sec 内存限制: 128 MB 题目描述 A power network consists of nodes (power stations, cons ...
- [POJ1273][USACO4.2]Drainage Ditches (网络流最大流)
题意 网络流最大流模板 思路 EK也不会超时 所以说是一个数据比较水的模板题 但是POJ有点坑,多组数据,而且题目没给 哭得我AC率直掉 代码 用的朴素Dinic #include<cstdio ...
- HDU 3081 Marriage Match II (网络流,最大流,二分,并查集)
HDU 3081 Marriage Match II (网络流,最大流,二分,并查集) Description Presumably, you all have known the question ...
- HDU1532 网络流最大流【EK算法】(模板题)
<题目链接> 题目大意: 一个农夫他家的农田每次下雨都会被淹,所以这个农夫就修建了排水系统,还聪明的给每个排水管道设置了最大流量:首先输入两个数n,m ;n为排水管道的数量,m为节点的数量 ...
- Redraw Beautiful Drawings(hdu4888)网络流+最大流
Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/O ...
- A simple Gaussian elimination problem.(hdu4975)网络流+最大流
A simple Gaussian elimination problem. Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65 ...
- 【bzoj3130】[Sdoi2013]费用流 二分+网络流最大流
题目描述 Alice和Bob做游戏,给出一张有向图表示运输网络,Alice先给Bob一种最大流方案,然后Bob在所有边上分配总和等于P的非负费用.Alice希望总费用尽量小,而Bob希望总费用尽量大. ...
- 【bzoj1822】[JSOI2010]Frozen Nova 冷冻波 计算几何+二分+网络流最大流
题目描述 WJJ喜欢“魔兽争霸”这个游戏.在游戏中,巫妖是一种强大的英雄,它的技能Frozen Nova每次可以杀死一个小精灵.我们认为,巫妖和小精灵都可以看成是平面上的点. 当巫妖和小精灵之间的直线 ...
随机推荐
- 【BZOJ】1610: [Usaco2008 Feb]Line连线游戏
[算法]计算几何 [题解]计算所有斜率排序去重. 实数判断相等用fabs(...)≤eps. ★斜率题一定要注意斜率不存在的情况!!! 其实我觉得这份代码可以hack的…… #include<c ...
- pythonTensorFlow实现yolov3训练自己的目标检测探测自定义数据集
1.数据集准备,使用label标注好自己的数据集. https://github.com/tzutalin/labelImg 打开连接直接下载数据标注工具, 2.具体的大师代码见下链接 https:/ ...
- linux内存占用查看
查看内存使用情况 free free -m //显示单位为:兆 查看占用内存最高的5个进程ps aux | sort -k4nr | head -n 5 查看占用CPU最高的5个进程ps aux | ...
- Vue组件-组件的属性
在html中使用元素,会有一些属性,如class,id,还可以绑定事件,自定义组件也是可以的.当在一个组件中,使用了其他自定义组件时,就会利用子组件的属性和事件来和父组件进行数据交流. 比如,子组件需 ...
- qt-creator
https://github.com/qt-creator/qt-creator https://github.com/qt-creator
- openssl-0.9.8y
openssl-0.9.8y 支持 32位和64位 编译不报错和向上兼容和向下兼容. http://www.openssl.org/source/openssl-0.9.8y.tar.gz https ...
- HDU 5116 Everlasting L
题目链接:HDU-5116 题意:给定若干个整数点,若一个点集满足P = {(x, y), (x + 1, y), . . . , (x + a, y), (x, y + 1), . . . , (x ...
- Makefile系列之二 : 命令
一.显示命令 echo “@”字符可以控制命令是否在屏幕上显示,如 @echo 正在编译XXX模块...... 输出: 正在编译XXX模块...... 如果没有“@"则输出 : echo ...
- pypcap 安装
1.下载winpcap开发包 https://www.winpcap.org/devel.htm 下载https://github.com/pynetwork/pypcap/releases最新发布的 ...
- django使用haystack对接Elasticsearch实现商品搜索
# 原创,转载请留言联系 前言: 在做一个商城项目的时候,需要实现商品搜索功能. 说到搜索,第一时间想到的是数据库的 select * from tb_sku where name like %苹果手 ...