【bzoj2400】Spoj 839 Optimal Marks 按位最大流
Spoj 839 Optimal Marks
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 908 Solved: 347
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
2
-1
0
1 2
2 3
Sample Output
2
HINT
数据约定
n<=500,m<=2000
样例解释
2结点的值定为0即可。
因为是xor,可以从按位的思考
这种两个答案的,二维偏序差不多,一般会想到费用流,
但是这里可以是图的权值扩大到点权和到达不了的状态,即不由点权和影响。
这样/mx 为图的权值,%mx为点的权和。
然后考虑建图,设S为0集合,T为1集合,所以只需要考虑边两个端点一个选S,一个选T这样才会产生值。
看限制了,如果当前这位有值,那么就按这个赋值,如果是1,那么S-i为inf,i-T为1;
这样的,边的话,就是10000的边。
具体看代码。
每次的最大流的意义不同,代表1<<i。
#include<cstring>
#include<cmath>
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue> #define inf 1000000007
#define ll long long
#define N 507
#define M 20007
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if (ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} int n,m,S,T;
int num[N];
int cnt,hed[N],nxt[M],rea[M],val[M],cur[N];
int dis[N];
ll ans1,ans2;
struct Node
{
int x,y;
}a[M]; void add(int u,int v,int w)
{
nxt[++cnt]=hed[u];
hed[u]=cnt;
rea[cnt]=v;
val[cnt]=w;
}
void add_two_edge(int u,int v,int w)
{
add(u,v,w);
add(v,u,);
}
void build(int x)
{
memset(hed,-,sizeof(hed)),cnt=;
for (int i=;i<=n;i++)
if (num[i]<) add_two_edge(i,T,);
else
{
if (num[i]&(<<x))add_two_edge(S,i,inf),add_two_edge(i,T,);
else add_two_edge(i,T,inf);
}
for (int i=;i<=m;i++)
add_two_edge(a[i].x,a[i].y,),
add_two_edge(a[i].y,a[i].x,);
}
bool bfs()
{
for (int i=S;i<=T;i++)dis[i]=-;
dis[S]=;
queue<int>q;q.push(S);
while(!q.empty())
{
int u=q.front();q.pop();
for (int i=hed[u];i!=-;i=nxt[i])
{
int v=rea[i],fee=val[i];
if (dis[v]!=-||!fee)continue;
dis[v]=dis[u]+;
if (v==T)return ;
q.push(v);
}
}
return ;
}
ll dfs(int u,int MX)
{
ll res=;
if (MX==||u==T)return MX;
for (int i=cur[u];i!=-;i=nxt[i])
{
int v=rea[i],fee=val[i];
if (dis[v]!=dis[u]+)continue;
int x=dfs(v,min(MX,fee));
cur[u]=i,res+=x,MX-=x;
val[i]-=x,val[i^]+=x;
if (MX==) break;
}
if (!res)dis[u]=-;
return res;
}
ll dinic()
{
ll res=;
while(bfs())
{
for (int i=S;i<=T;i++)cur[i]=hed[i];
res+=dfs(,inf);
}
return res;
}
int main()
{
n=read(),m=read(),S=,T=n+;int mx=-;
for (int i=;i<=n;i++)
{
num[i]=read();
mx=max(mx,num[i]);
}
for (int i=;i<=m;i++)a[i].x=read(),a[i].y=read();
for (int i=;(<<i)<=mx;i++)
{
build(i);
ll res=dinic();
ans1+=(res/)*(ll)(<<i);
ans2+=(res%)*(ll)(<<i);
}
printf("%lld\n%lld\n",ans1,ans2);
}
【bzoj2400】Spoj 839 Optimal Marks 按位最大流的更多相关文章
- BZOJ2400: Spoj 839 Optimal Marks
Description 定义无向图中的一条边的值为:这条边连接的两个点的值的异或值. 定义一个无向图的值为:这个无向图所有边的值的和. 给你一个有n个结点m条边的无向图.其中的一些点的值是给定的,而其 ...
- BZOJ 2400: Spoj 839 Optimal Marks (按位最小割)
题面 一个无向图,一些点有固定权值,另外的点权值由你来定. 边的值为两点的异或值,一个无向图的值定义为所有边的值之和. 求无向图的最小值 分析 每一位都互不干扰,按位处理. 用最小割算最小值 保留原图 ...
- 【BZOJ2400】Spoj 839 Optimal Marks 最小割
[BZOJ2400]Spoj 839 Optimal Marks Description 定义无向图中的一条边的值为:这条边连接的两个点的值的异或值. 定义一个无向图的值为:这个无向图所有边的值的和. ...
- 【bzoj2400】Spoj 839 Optimal Marks 网络流最小割
题目描述 定义无向图中的一条边的值为:这条边连接的两个点的值的异或值. 定义一个无向图的值为:这个无向图所有边的值的和. 给你一个有n个结点m条边的无向图.其中的一些点的值是给定的,而其余的点的值由你 ...
- spoj 839 Optimal Marks(二进制位,最小割)
[题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17875 [题意] 给定一个图,图的权定义为边的两端点相抑或值的 ...
- SPOJ 839 Optimal Marks(最小割的应用)
https://vjudge.net/problem/SPOJ-OPTM 题意: 给出一个无向图G,每个点 v 以一个有界非负整数 lv 作为标号,每条边e=(u,v)的权w定义为该边的两个端点的标号 ...
- 图论(网络流):SPOJ OPTM - Optimal Marks
OPTM - Optimal Marks You are given an undirected graph G(V, E). Each vertex has a mark which is an i ...
- SPOJ OPTM - Optimal Marks
OPTM - Optimal Marks no tags You are given an undirected graph G(V, E). Each vertex has a mark whic ...
- 839. Optimal Marks - SPOJ
You are given an undirected graph G(V, E). Each vertex has a mark which is an integer from the range ...
随机推荐
- How to save console output to a file in Eclipse
https://coderanch.com/t/278299/java/Writing-output-console-file-system File file = new File("te ...
- 巧妙使用JQuery Clone 添加多行数据,并更新到数据库
WEB代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="BatchAdd. ...
- 讲说问题:|和||的区别以及&和&&的区别。2、Java中的数据类型分几类?基本数据类型有哪些?
|和||的区别以及&和&&的区别. |或 为或运算 判断为逻辑或 || 为短路或 只有逻辑判断 当左侧为真不再继续判断 &与 为与运算 判断为逻辑与 && ...
- JavaScript获取时间戳与时间戳转化
第一种方法(精确到秒): var timestamp1 = Date.parse( new Date()); 第二种方法(精确到毫秒): var timestamp2 = ( new Date()). ...
- Zabbix监控告警Lack of free swap space on Zabbix server解决办法
报错详情如下: 是因为Zabbix监控没有考虑虚拟主机的交换空间情况 解决办法修改配置 修改表达式内容:{Template OS Linux:system.swap.size[,pfree].last ...
- JavaScript常用八种继承方案
更新:在常用七种继承方案的基础之上增加了ES6的类继承,所以现在变成八种啦,欢迎加高级前端进阶群一起学习(文末). --- 2018.10.30 1.原型链继承 构造函数.原型和实例之间的关系:每个构 ...
- 文档对象模型 DOM
1 DOM概述 1.1 什么是DOM 文档对象模型 Document Object Model 文档对象模型 是表示和操作 HTML和XML文档内容的基础API 文档对象模型,是W3C组织推荐的处理可 ...
- Louis Armstrong【路易斯·阿姆斯特朗】
Louis Armstrong Louis Armstrong had two famous nicknames. 路易斯·阿姆斯特朗有两个著名的绰号. Some people called him ...
- 最短路径:HDU2006-一个人的旅行(多个起点,多个终点)
题目: 一个人的旅行 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- “帮你APP”团队冲刺1
1.整个项目预期的任务量 (任务量 = 所有工作的预期时间)和 目前已经花的时间 (所有记录的 ‘已经花费的时间’),还剩余的时间(所有工作的 ‘剩余时间’) : 所有工作的预期时间:88h 目前已经 ...