首先xor类的题目一定要逐位考虑,因为位位之间是不相互影响的
逐位考虑每个点是0还是1,这就转化成了一个这样一个问题
对于每个点可以选择属于S集合(这位是0)或T集合(这位是1)
某些的点对(一条边的两端)属于不同集合会产生一个附加值1(边权)
现在要是附加值最小(边权当前位为1的边最少),并且属于S集合的尽可能多(点权当前位为1尽可能少)
显然第一个问题是一个最小割的问题,对于已经确定这位是什么的点i来说
是0则连边s-->i 容量inf,是1则连边i-->t容量是inf,因为这些点当前位是确定的
然后对一条边(u,v),连边u-->v v-->u 容量都是1,最小割就是最小附加值
这里为什么不用给不确定的点向s,t连边呢?这个我也没有想清楚
反正直观的感受,当一条路径直接或间接连接着则两点一个确定为0,一个确定为1,
那么这条路径最少会产生附加值1,一定要被割断,否则这条路径我一定能使它不产生附加值
下面考虑让属于S的点(这位是0的点)尽可能多
考虑在残流网络上是不存在增广路的,也就是对于一个未确定点i,如果这个点能属于S
那么我从s到i给一个流量,这个流量从点i一定不能流向t,否则就会增大边权和
因此我们只要对于每个未确定的点i在残流网络上顺着剩余容量大于0的边dfs,
只要到不了t,那么这个点就可以属于S(这位为0),否则不行
这样就解决了

 const inf=;
type node=record
point,next,flow:longint;
end; var edge:array[..] of node;
p,cur,d,a,pre,h,numh:array[..] of longint;
v:array[ ..] of boolean;
x,y:array[..] of longint;
i,j,n,m,k,len,t,b:longint;
ans1,ans2:int64; function min(a,b:longint):longint;
begin
if a>b then exit(b) else exit(a);
end; procedure add(x,y,f:longint);
begin
inc(len);
edge[len].point:=y;
edge[len].flow:=f;
edge[len].next:=p[x];
p[x]:=len;
end; function sap:longint;
var u,i,j,tmp,neck,q:longint;
begin
fillchar(h,sizeof(h),);
fillchar(numh,sizeof(numh),);
numh[]:=t+;
u:=;
for i:= to t do
cur[i]:=p[i];
neck:=inf;
sap:=;
while h[]<t+ do
begin
d[u]:=neck;
i:=cur[u];
while i<>- do
begin
j:=edge[i].point;
if (edge[i].flow>) and (h[u]=h[j]+) then
begin
pre[j]:=u;
cur[u]:=i;
neck:=min(neck,edge[i].flow);
u:=j;
if u=t then
begin
sap:=sap+neck;
while u<> do
begin
u:=pre[u];
j:=cur[u];
dec(edge[j].flow,neck);
inc(edge[j xor ].flow,neck);
end;
neck:=inf;
end;
break;
end;
i:=edge[i].next;
end;
if i=- then
begin
dec(numh[h[u]]);
if numh[h[u]]= then exit;
tmp:=t;
q:=-;
i:=p[u];
while i<>- do
begin
j:=edge[i].point;
if edge[i].flow> then
if h[j]<tmp then
begin
tmp:=h[j];
q:=i;
end;
i:=edge[i].next;
end;
h[u]:=tmp+;
cur[u]:=q;
inc(numh[h[u]]);
if u<> then
begin
u:=pre[u];
neck:=d[u];
end;
end;
end;
end; function dfs(x:longint):boolean;
var i,y:longint;
begin
v[x]:=true;
if x=t then exit(true);
i:=p[x];
while i<>- do
begin
y:=edge[i].point;
if (edge[i].flow>) and not v[y] then
if dfs(y) then exit(true);
i:=edge[i].next;
end;
exit(false);
end; begin
readln(n,m);
b:=;
for i:= to n do
begin
readln(a[i]);
if (a[i]>) and (trunc(ln(a[i])/ln())>b) then
b:=trunc(ln(a[i])/ln()); //显然比以确定点的最大位数还大的位直接取0即可
if a[i]> then ans2:=ans2+a[i];
end;
for i:= to m do
readln(x[i],y[i]);
t:=n+;
for i:= to b do
begin
len:=-;
fillchar(p,sizeof(p),);
for j:= to n do
if a[j]>= then
begin
if a[j] and ( shl i)= then
begin
add(,j,inf);
add(j,,);
end
else begin
add(j,t,inf);
add(t,j,);
end;
end;
for j:= to m do
begin
add(x[j],y[j],);
add(y[j],x[j],);
add(y[j],x[j],);
add(x[j],y[j],);
end;
ans1:=ans1+int64(sap)*int64( shl i); // shl i是这位位权
for j:= to n do
if a[j]< then
begin
fillchar(v,sizeof(v),false);
if dfs(j) then ans2:=ans2+ shl i; //能访问到t则这个点当前位不能为0
end;
end;
writeln(ans1);
writeln(ans2);
end.

bzoj2400的更多相关文章

  1. 【BZOJ2400】Spoj 839 Optimal Marks 最小割

    [BZOJ2400]Spoj 839 Optimal Marks Description 定义无向图中的一条边的值为:这条边连接的两个点的值的异或值. 定义一个无向图的值为:这个无向图所有边的值的和. ...

  2. 【BZOJ-2400】Spoj839Optimal Marks 最小割 + DFS

    2400: Spoj 839 Optimal Marks Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 567  Solved: 202[Submit ...

  3. BZOJ2400: Spoj 839 Optimal Marks

    Description 定义无向图中的一条边的值为:这条边连接的两个点的值的异或值. 定义一个无向图的值为:这个无向图所有边的值的和. 给你一个有n个结点m条边的无向图.其中的一些点的值是给定的,而其 ...

  4. 【bzoj2400】Spoj 839 Optimal Marks 按位最大流

    Spoj 839 Optimal Marks Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 908  Solved: 347[Submit][Stat ...

  5. 【bzoj2400】Spoj 839 Optimal Marks 网络流最小割

    题目描述 定义无向图中的一条边的值为:这条边连接的两个点的值的异或值. 定义一个无向图的值为:这个无向图所有边的值的和. 给你一个有n个结点m条边的无向图.其中的一些点的值是给定的,而其余的点的值由你 ...

  6. 【BZOJ2400】Optimal Marks

    题意 定义无向图中的一条边的值为:这条边连接的两个点的值的异或值. 定义一个无向图的值为:这个无向图所有边的值的和. 给你一个有 \(n\) 个结点 \(m\) 条边的无向图.其中的一些点的值是给定的 ...

  7. [bzoj2400]Optimal Marks

    首先肯定每一位单独考虑,对于每一位,源点连向该位点权为0的节点inf的边,点权为1的节点连向汇点inf的边,每一条无向边拆成两条流量为1的有向边,跑最小割. 考虑一组割,一定将原图划分成源点和汇点两部 ...

  8. [转载]hzwer的bzoj题单

    counter: 664BZOJ1601 BZOJ1003 BZOJ1002 BZOJ1192 BZOJ1303 BZOJ1270 BZOJ3039 BZOJ1191 BZOJ1059 BZOJ120 ...

  9. BZOJ刷题列表【转载于hzwer】

    沿着黄学长的步伐~~ 红色为已刷,黑色为未刷,看我多久能搞完吧... Update on 7.26 :之前咕了好久...(足见博主的flag是多么emmm......)这几天开始会抽时间刷的,每天几道 ...

随机推荐

  1. ICMP协议

    1. ICMP简介: ICMP全名为(INTERNET CONTROL MESSAGE PROTOCOL)网络控制报文协议,协议号为1,网络层协议. 它是TCP/IP协议族的一个子协议,用于在IP主机 ...

  2. android开发之Notification学习笔记

    今天总结了一下Notification的使用,与大家分享一下. MainActivity.java: 本文参考:http://www.jb51.net/article/36567.htm,http:/ ...

  3. PHP利用超级全局变量$_POST来接收表单数据。

    利用$_POST超级全局变量接收表单的数据,然后利用echo输出到页面. 下面是代码: <!doctype html> <html> <head> <titl ...

  4. C#语法糖之开篇

    本人虽然大学不是学的计算机但是对于IT行业的热爱,依然决然进军IT行业了,自从踏进这个行业到现在也已经3年多了,从去年开发通过网上 了解博客园后深深的爱上这儿了,这里有很多牛人,通过拜读他们的代码,让 ...

  5. jquery---点击弹出层

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. Hash - a javascript dictionary object.

    Hash,in wikipedia, may relevant to many stuffs. In javascript, hash is a group of name/value pairs w ...

  7. javascript基础学习(八)

    javascript之日期对象 学习要点: 日期对象 将日期对象转换为字符串 将日期对象中的日期和时间转换为字符串 日期对象中的日期 日期对象中的时间 设置日期对象中的日期 设置日期对象中的时间 与毫 ...

  8. cas sso单点登录系列8_抛弃Https让Cas以Http协议提供单点登录服务

    转:http://blog.csdn.net/ycyk_168/article/details/18668951 本文环境: 1.apache-tomcat-7.0.50-windows-x86 2. ...

  9. string相关

    1.find相关 string s="abcd"; size_t pos0 = s.find_first_of("dcb");         1    //返 ...

  10. Python自动化运维之27、Django(一)

    一.概述 1.什么是框架? 框架,即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单说就是使用别人搭好的舞台,你来做表演. 2.常 ...