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每次可以杀死一个小精灵.我们认为,巫妖和小精灵都可以看成是平面上的点. 当巫妖和小精灵之间的直线 ...
随机推荐
- 密码本(无bug版)
main.cpp #include <stdio.h> #include <stdlib.h> #include "data.h" #include &qu ...
- 大聊Python----quene队列
当必须在多个线程之间安全地交换信息时,队列在线程编程中特别有用. class queue.Queue(maxsize=0) # 先入先出class queue.LifoQueue(maxsize=0 ...
- Javascript prototype 及 继承机制的设计思想
我一直很难理解Javascript语言的继承机制. 它没有"子类"和"父类"的概念,也没有"类"(class)和"实例" ...
- Port-knocking 简单教程
0. "port knocking" 如字面意思,类似'敲门',只是这里敲的是'端口',而且需要按照顺序'敲'端口.如果敲击规则匹配,则可以让防火墙实时更改策略.从而达到开关防火墙 ...
- 2017-2018-1 20179205《Linux内核原理与设计》第八周作业
<Linux内核原理与设计>第八周作业 视频学习及操作分析 预处理.编译.链接和目标文件的格式 可执行程序是怎么来的? 以C语言为例,经过编译器预处理.编译成汇编代码.汇编器编译成目标代码 ...
- Python模块学习 - ConfigParser
配置文件 很多软件都用到了配置文件,像git运行的时候会读取~/gitconfig,MySQL运行的时候会读取/etc/my.cnf,Python 提供的包管理工具pip命令,也会去读取~/.pip/ ...
- Jquery屏蔽浏览器的F1-F12快捷键,在IE,GOOGLE下测试均无问题
在网上找了找,很多都是js实现的,东找西找,再加上自己的想法也勉强的完成了,直接看代码 <script type="text/javascript" src="Sc ...
- Leetcode 之Flatten Binary Tree to Linked List(50)
将左子树接到右子树之前,递归解决 void flatten(TreeNode *root) { if (root == nullptr)return; flatten(root->left); ...
- [转载]NGINX原理分析 之 SLAB分配机制
作者:邹祁峰 邮箱:Qifeng.zou.job@hotmail.com 博客:http://blog.csdn.net/qifengzou 日期:2013.09.15 23:19 转载请注明来自&q ...
- 一个前端资源站 http://www.bootcss.com/
http://www.bootcss.com/ 里面有w3schools原版的镜像网站地址: https://www.quanzhanketang.com/ 这个网站正常版本被墙了,可以通过这个镜像访 ...