【bzoj2400】Spoj 839 Optimal Marks 网络流最小割
题目描述
输入
输出
样例输入
3 2
2
-1
0
1 2
2 3
样例输出
2
2
题解
网络流最小割
由于xor是二进制位运算,因此我们可以拆位处理。
拆位以后每个点只为0或1,相邻的点选择不同则会产生代价,问最小代价。
显然是最小割。
对于每个点,如果它已经确定,则如果其为1则向T连边,如果其为0则S向其连边,容量为inf。
对于相邻的点,相互连边,容量为1。
然后最小割即为第一问答案。
对于第二问答案,有一个神方法,可以直接跑一遍最小割就能算出来。
具体就是原来的1全部改为10000,然后S向所有点,容量为1。跑最小割时,肯定要保证割10000边的条数最小,即为第一问答案;而在此基础上每有一个数为1,则需要额外割一条1边,所以同时让割1边的条数最小,也就保证了1的个数最少。
最后把每一位的结果加起来即为答案。注意要开long long。
#include <cstdio>
#include <cstring>
#include <queue>
#define N 510
#define M 20010
using namespace std;
typedef long long ll;
const int inf = 1 << 30;
queue<int> q;
int n , m , v[N] , x[M] , y[M] , head[N] , to[M] , val[M] , next[M] , cnt , s , t , dis[N];
ll ans1 , ans2;
void add(int x , int y , int z)
{
to[++cnt] = y , val[cnt] = z , next[cnt] = head[x] , head[x] = cnt;
to[++cnt] = x , val[cnt] = 0 , next[cnt] = head[y] , head[y] = cnt;
}
bool bfs()
{
int x , i;
memset(dis , 0 , sizeof(dis));
while(!q.empty()) q.pop();
dis[s] = 1 , q.push(s);
while(!q.empty())
{
x = q.front() , q.pop();
for(i = head[x] ; i ; i = next[i])
{
if(val[i] && !dis[to[i]])
{
dis[to[i]] = dis[x] + 1;
if(to[i] == t) return 1;
q.push(to[i]);
}
}
}
return 0;
}
int dinic(int x , int low)
{
if(x == t) return low;
int temp = low , i , k;
for(i = head[x] ; i ; i = next[i])
{
if(val[i] && dis[to[i]] == dis[x] + 1)
{
k = dinic(to[i] , min(temp , val[i]));
if(!k) dis[to[i]] = 0;
val[i] -= k , val[i ^ 1] += k;
if(!(temp -= k)) break;
}
}
return low - temp;
}
void solve(int k)
{
int i , c = 0;
memset(head , 0 , sizeof(head)) , cnt = 1;
for(i = 1 ; i <= n ; i ++ )
{
add(s , i , 1);
if(v[i] >= 0)
{
if(v[i] & k) add(i , t , inf);
else add(s , i , inf);
}
}
for(i = 1 ; i <= m ; i ++ ) add(x[i] , y[i] , 10000) , add(y[i] , x[i] , 10000);
while(bfs()) c += dinic(s , inf);
ans1 += (ll)c / 10000 * k , ans2 += (ll)c % 10000 * k;
}
int main()
{
int i;
scanf("%d%d" , &n , &m) , s = 0 , t = n + 1;
for(i = 1 ; i <= n ; i ++ ) scanf("%d" , &v[i]);
for(i = 1 ; i <= m ; i ++ ) scanf("%d%d" , &x[i] , &y[i]);
for(i = 1 << 30 ; i ; i >>= 1) solve(i);
printf("%lld\n%lld\n" , ans1 , ans2);
return 0;
}
【bzoj2400】Spoj 839 Optimal Marks 网络流最小割的更多相关文章
- SPOJ 839 Optimal Marks(最小割的应用)
https://vjudge.net/problem/SPOJ-OPTM 题意: 给出一个无向图G,每个点 v 以一个有界非负整数 lv 作为标号,每条边e=(u,v)的权w定义为该边的两个端点的标号 ...
- BZOJ2400: Spoj 839 Optimal Marks
Description 定义无向图中的一条边的值为:这条边连接的两个点的值的异或值. 定义一个无向图的值为:这个无向图所有边的值的和. 给你一个有n个结点m条边的无向图.其中的一些点的值是给定的,而其 ...
- 【BZOJ2400】Spoj 839 Optimal Marks 最小割
[BZOJ2400]Spoj 839 Optimal Marks Description 定义无向图中的一条边的值为:这条边连接的两个点的值的异或值. 定义一个无向图的值为:这个无向图所有边的值的和. ...
- 【bzoj2400】Spoj 839 Optimal Marks 按位最大流
Spoj 839 Optimal Marks Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 908 Solved: 347[Submit][Stat ...
- SP839 Optimal marks(最小割)
SP839 Optimal marks(最小割) 给你一个无向图G(V,E). 每个顶点都有一个int范围内的整数的标记. 不同的顶点可能有相同的标记.对于边(u,v),我们定义Cost(u,v)= ...
- SPOJ 839 OPTM - Optimal Marks (最小割)(权值扩大,灵活应用除和取模)
http://www.spoj.com/problems/OPTM/ 题意: 给出一张图,点有点权,边有边权 定义一条边的权值为其连接两点的异或和 定义一张图的权值为所有边的权值之和 已知部分点的点权 ...
- spoj 839 Optimal Marks(二进制位,最小割)
[题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17875 [题意] 给定一个图,图的权定义为边的两端点相抑或值的 ...
- BZOJ 2400: Spoj 839 Optimal Marks (按位最小割)
题面 一个无向图,一些点有固定权值,另外的点权值由你来定. 边的值为两点的异或值,一个无向图的值定义为所有边的值之和. 求无向图的最小值 分析 每一位都互不干扰,按位处理. 用最小割算最小值 保留原图 ...
- SPOJ839 Optimal Marks(最小割)
题目大概说给一张图,每个点都有权,边的权等于其两端点权的异或和,现已知几个点的权,为了使所有边的边权和最小,其他点的权值该是多少. 很有意思的一道题,完全看不出和网络流有什么关系. 考虑每个未知的点$ ...
随机推荐
- hiho一下 第四十五周 博弈游戏·Nim游戏·二(转成NIm)
Alice和Bob这一次准备玩一个关于硬币的游戏:N枚硬币排成一列,有的正面朝上,有的背面朝上,从左到右依次编号为1..N.现在两人轮流翻硬币,每次只能将一枚正面朝上的硬币翻过来,并且可以随自己的意愿 ...
- 【Python图像特征的音乐序列生成】第一阶段的任务分配
从即日起到7月20号,项目成员进行了第一次任务分配. 赵同学A.岳同学.周同学,负责了图像数据的情感数据集制作,他们根据自己的经验,对图像进行了情绪提取. 赵同学B全权负责向量映射这一块的网络搭建. ...
- xcode技巧
1.统计ios开发代码,包括头文件的,终端命令进入项目目录下,命令如下 find . -name "*.m" -or -name "*.h" -or -name ...
- ABAP function group和Tomcat library重复加载问题
ABAP ABAP help文档里对**LOAD-OF-PROGRAM"的关键字是这样描述的: This event keyword defines the program construc ...
- Predicate和Consumer接口的使用
// Predicate 判断是否拥有资格,Consumer 改变输入的值 案例 public static MyTest2 getV(MyTest2 a, Predicate<MyTe ...
- Hbase 操作工具类
依赖jar <dependency> <groupId>org.apache.hbase</groupId> <artifactId>hbase-cli ...
- 2017乌鲁木齐网络赛 j 题
题目连接 : https://nanti.jisuanke.com/t/A1256 Life is a journey, and the road we travel has twists and t ...
- SQL Server将列以分隔符分割后存到临时表
begin if object_id('tempdb..#t') is not null drop table #t; create table #t ( filepath ) ); declare ...
- 【动态规划】51nod1780 完美序列
巧妙的转化:f前两维大小开反TLE了一发…… 如果一个序列的相邻两项差的绝对值小于等于1,那么我们说这个序列是完美的. 给出一个有序数列A,求有多少种完美序列排序后和数列A相同. Input 第一行一 ...
- 15Shell脚本—流程控制
流程控制语句 尽管可以通过使用Linux命令.管道符.重定向以及条件测试语句编写最基本的Shell脚本,但是这种脚本并不适用于生产环境.原因是它不能根据真实的工作需求来调整具体的执行命令,也不能根据某 ...