【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 ...
随机推荐
- ES6 Promise用法详解
What is Promise? Promise是一个构造函数,接受一个参数(Function),并且该参数接受两个参数resolve和reject(分别表示异步操作执行成功后的回调函数.执行失败后的 ...
- 使TextBox的内容换行
首先你把TextBox控件的MultiLine属性设置为True,然后把TextBox控件的Text属性根据程序需要,在需要换行的地方加入\r\n这样就可实现换行了
- AngularJS 应用
AngularJS模块(Module)定义了AngularJS的应用. AngularJS控制器(Controller)用于控制AngularJS应用. ng-app指令定义了应用,ng-contro ...
- C#赋值运算符
一.C#赋值运算符 C#语言的赋值运算符用于将一个数据赋予一个变量.属性或者引用.数据可以是常量.变量或者表达式. 1. 简单赋值 “=”操作符被称为简单赋值操作符.在一个简单赋值中,右操作数必须为某 ...
- 3170: [Tjoi2013]松鼠聚会
Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1804 Solved: 968[Submit][Status][Discuss] Descript ...
- 1025: [SCOI2009]游戏
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2727 Solved: 1794[Submit][Status][Discuss] Descripti ...
- Ubuntu12.04下YouCompleteMe安装教程(部分)
1.通过源码编译安装VIM 开发中使用的是Ubuntu 12.04 LTS,通过sudo apt-get install vim安装的版本较低,不支持YCM,所以,用源码编译并安装最新的Vim. 卸载 ...
- Play on Words HDU - 1116 (并查集 + 欧拉通路)
Play on Words HDU - 1116 Some of the secret doors contain a very interesting word puzzle. The team o ...
- Elastic Search和Kibana入门
一.ES配置 二.ES本地快速搭建集群 查看ES集群 查看node详细情况 三.Kibana配置 修改kibana的es配置 访问localhost:5601端口 四.Elasticsearch 术语 ...
- Python对文本文件的简单操作(一)
工作背景 性能测试工程师,主要测试工具--loadrunner,主要是接口测试. 实现功能 loadrunner对报文格式的转换存在问题,部分报文无法转换,故使用Python编写脚本自动将soap协议 ...