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每次可以杀死一个小精灵.我们认为,巫妖和小精灵都可以看成是平面上的点. 当巫妖和小精灵之间的直线 ...
随机推荐
- python碎片记录(一)
1.python中求幂运算 2**31-1 2的31次方减一(32位整型数据范围为-2^31~2^31-1,最高位为符号位,负向值比正向值绝对值大1) 2.python中整数除法 x=x//1 ...
- 【转】使用SQL语句创建和删除约束
转自http://blog.csdn.net/hamber_bao/article/details/6504905 约束的目的就是确保表中的数据的完整性. 常用的约束类型如下: 主键约束:(Prima ...
- python实战===用python识别图片中的中文
需要安装的模块 PIL pytesseract 需要下载的工具: http://download.csdn.net/download/bo_mask/10196285 因为之前百度云的链接总失效,所以 ...
- 刷新SqlServer数据库中所有的视图
ALTER PROCEDURE sp_refallview AS --刷新所有视图 DECLARE @ViewName VARCHAR(MAX); DECLARE @i INT; ; DECLARE ...
- BZOJ 3771 生成函数,FFT
Description 我们讲一个悲伤的故事. 从前有一个贫穷的樵夫在河边砍柴. 这时候河里出现了一个水神,夺过了他的斧头,说: “这把斧头,是不是你的?” 樵夫一看:“是啊是啊!” 水神把斧头扔在一 ...
- edittext 的一个案例
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android= ...
- 部署HBase系统(分布式部署)
1.简介 HBase系统主要依赖于zookeeper和hdfs系统,所以部署HBase需要先去部署zookeeper和hadoop 2.部署开始 IP或者HOSTNAME需要根据自身主机信息设定. 部 ...
- ASP.NET Core Module overview模块概述
原文地址:ASP.NET Core Module overview By Tom Dykstra, Rick Strahl, and Chris Ross ASP.NET Core模块(ANCM)让你 ...
- C#面向对象(OOP)入门—第一天—多态和继承(方法重载)
面向对象是什么 面向对象是一种基于对象的编程方法,它取代了仅仅依靠方法和流程的编程方式.面向对象的编程语言中,对象(object)其实就是指特定类型.或某个类的实例.面向对象使得编程人员更容易组织和管 ...
- Zabbix历史数据库迁移 及分区
https://blog.csdn.net/hkyw000/article/details/78971201?utm_source=blogxgwz6