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. 双关键字LIS

    首先对于双关键字的LIS有一个比较暴力的方法,就是线段树套平衡树,我们把双关键字的LIS抽象成二维坐标系中的点,这样我们对于当前转移的点i(x,y),需要找的就是在(xx,yy)xx<x,yy& ...

  2. 工具_HBuilder使用快捷方式

    HBuilder常用快捷键大概共9类([4 13 3]文件.编辑.插入:[4 9 8]选择.跳转.查找:[1 1 6]运行.工具.视图) 1.文件(4) 新建 Ctrl + N 关闭 Ctrl + F ...

  3. web-project 故障查看功能 检测是否启动fmd服务

    def check_fmd_service(): try: output = subprocess.check_output('svcs -H -o state fmd',shell=True) st ...

  4. linux系统引导流程

    1.固件:硬件和软件结合.加电自检是我们按下电源会检测硬件像cpu.内存.网卡等信息.(从硬件层次检测硬件是否可用) 固件设置实例:设置时间 软件时间和硬件时间: [root@VM_0_12_cent ...

  5. elk + suricata 实验环境详细安装教程

    1.安装运行suricata,需要*** sudo add-apt-repository ppa:oisf/suricata-stable sudo apt-get update sudo apt-g ...

  6. device tree --- #interrupt-cells property

    device tree source Example1 interrupt-controller@e000e100 { ... ... #interrupt-cells = <0x1>; ...

  7. Django===django工作流

    通过一张图来总结一下Django 的处理过程: URL 组成: 协议类型: HTTP/HTTPS HTTP 协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW ...

  8. xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance(xsi:schemaLocation详解)

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"中xsi的意思是 :本xml文件中要用到某些来自xsi代表的“http:/ ...

  9. C/C++——[01] 程序的基本框架

    我们以HelloWorld这个简单程序为例,该程序在终端打印一行文本: Hello World! 代码如下: #include <stdio.h> int main(){ printf(& ...

  10. 简单搞懂OAuth2.0

    本文转自:https://www.cnblogs.com/flashsun/p/7424071.html 原作者:闪客sun 一张图搞定OAuth2.0 目录 1.引言 2.OAuth2.0是什么 3 ...