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 网络流 最大流的更多相关文章

  1. 星屑幻想 optimal mark

    LINK :SP839 星屑幻想 取自 OJ 的名称 小事情...题目大意还是要说的这道题比较有意思,想了一段时间. 给你一张图 这张图给答案带来的贡献是每条边上两个点值得异或 一些点的值已经被确定 ...

  2. POJ 1459-Power Network(网络流-最大流-ISAP)C++

    Power Network 时间限制: 1 Sec  内存限制: 128 MB 题目描述 A power network consists of nodes (power stations, cons ...

  3. [POJ1273][USACO4.2]Drainage Ditches (网络流最大流)

    题意 网络流最大流模板 思路 EK也不会超时 所以说是一个数据比较水的模板题 但是POJ有点坑,多组数据,而且题目没给 哭得我AC率直掉 代码 用的朴素Dinic #include<cstdio ...

  4. HDU 3081 Marriage Match II (网络流,最大流,二分,并查集)

    HDU 3081 Marriage Match II (网络流,最大流,二分,并查集) Description Presumably, you all have known the question ...

  5. HDU1532 网络流最大流【EK算法】(模板题)

    <题目链接> 题目大意: 一个农夫他家的农田每次下雨都会被淹,所以这个农夫就修建了排水系统,还聪明的给每个排水管道设置了最大流量:首先输入两个数n,m ;n为排水管道的数量,m为节点的数量 ...

  6. Redraw Beautiful Drawings(hdu4888)网络流+最大流

    Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/O ...

  7. A simple Gaussian elimination problem.(hdu4975)网络流+最大流

    A simple Gaussian elimination problem. Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65 ...

  8. 【bzoj3130】[Sdoi2013]费用流 二分+网络流最大流

    题目描述 Alice和Bob做游戏,给出一张有向图表示运输网络,Alice先给Bob一种最大流方案,然后Bob在所有边上分配总和等于P的非负费用.Alice希望总费用尽量小,而Bob希望总费用尽量大. ...

  9. 【bzoj1822】[JSOI2010]Frozen Nova 冷冻波 计算几何+二分+网络流最大流

    题目描述 WJJ喜欢“魔兽争霸”这个游戏.在游戏中,巫妖是一种强大的英雄,它的技能Frozen Nova每次可以杀死一个小精灵.我们认为,巫妖和小精灵都可以看成是平面上的点. 当巫妖和小精灵之间的直线 ...

随机推荐

  1. 【BZOJ】1697: [Usaco2007 Feb]Cow Sorting牛排序

    [算法]数学置换 [题意]给定n个数,要求通过若干次交换两个数的操作得到排序后的状态,每次交换代价为两数之和,求最小代价. [题解] 考虑置换的定义:置换就是把n个数做一个全排列. 从原数组到排序数组 ...

  2. 使用abp的 redis cache

    top 使用abp的 redis cache -1. 在微软维护的github项目的release里找到redis的windows版本 64位 大约5M,安装,安装,然后在安装目录找到redis.wi ...

  3. 大聊Python----SocketServer

    什么是SocketServer? SocketServer的最主要的作用是实现并发处理,也就是可以多个用户同时上传和下载文件. socketserver模块简化了编写网络服务器的任务. sockets ...

  4. static class 和 non static class 的区别

    static class non static class 1.用static修饰的是内部类,此时这个 内部类变为静态内部类:对测试有用: 2.内部静态类不需要有指向外部类的引用: 3.静态类只能访问 ...

  5. linux网络编程之IO函数

    Linux操作系统中的IO函数主要有read(),write(),recv(),send(),recvmsg(),sendmsg(),readv(),writev(). 接收数据的recv()函数 # ...

  6. 定制LFS镜像及安装过程

    定制LFS镜像及安装过程 http://blog.csdn.net/decload/article/details/7407698 一.定制LFS镜像        定制LFS镜像的思想是在已构建完成 ...

  7. 使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程

    使用IDA PRO+OllyDbg+PEview 追踪windows API 动态链接库函数的调用过程 http://blog.csdn.net/liujiayu2/article/details/5 ...

  8. mongodb 学习笔记 3 --- 查询

    在mongodb的查询中可以通过使用如下操作符进行深度查询 1.条件操作符 $gt  $gte : >  >=   {"age":{"$gt":18 ...

  9. Deep Learning基础--CNN的反向求导及练习

    前言: CNN作为DL中最成功的模型之一,有必要对其更进一步研究它.虽然在前面的博文Stacked CNN简单介绍中有大概介绍过CNN的使用,不过那是有个前提的:CNN中的参数必须已提前学习好.而本文 ...

  10. mysql utf8改utf8mb4

    由于需要用到utf8mb4,之前是utf8现在给改成utf8mb4 查看当前环境 SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' ...