[POI2012] BEZ-Minimalist Security
一张n个点m条边的无向图,有点权有边权都是非负,且每条边的权值小于等于两个顶点的权值和,现在要将每个点减一个非负整数使得每条边权等于两个顶点的点权和,问最大修改代价和最小修改代价
思路神的一匹,完全想不出来,对着题解想了半天才有点理解
首先有一个小结论:对于一个联通块,如果一个顶点的值确定了,其余顶点的值都能确定。这是显然的,因为直接用一条边的边权减去已知点权就是另一个点的权值。如果我们设一个点的权值为x,与之相连的边权为w,另一点点权即为w-x
这样的话其实整个联通块内所有的点权都可以表示成y=k*x+b(k∈(-1,1))的形式,我们对于解一下关于y的不等式即可
特别注意的是,如果图中存在奇环,那么某个点会存在两种系数不同的表示,这时我们直接解这个方程就可以求出x的唯一解

这时我们还得保证x解出来为整数,这也是做这个题目要注意的的一点
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<cstdlib>
#define N 300010
#define M 5000010
#define ll long long
using namespace std;
queue<int>qx,qy; int n,m,num;
int head[N],val[N],q[N];
bool vis[N][];
ll ans1,ans2,v[N][]; int read()
{
char ch=getchar(); int f=,x=;
while(ch>''||ch<'') {if(ch=='-') f=-; ch=getchar();}
while(ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x*f;
} struct point{
int next,to,dis;
}e[M<<]; void add(int from,int to,int dis)
{
e[++num].next=head[from];
e[num].to=to;
e[num].dis=dis;
head[from]=num;
} void bfs(int x)
{
vis[x][]=;
qx.push(x); qy.push();
int tot=; q[++tot]=x;
while(!qx.empty())
{
int a=qx.front(),b=qy.front();
qx.pop(); qy.pop();
for(int i=head[a];i;i=e[i].next)
{
int to=e[i].to;
if(!vis[to][]&&!vis[to][]) q[++tot]=to;
if(vis[to][b^])
{
if(v[to][b^]!=e[i].dis-v[a][b]) {printf("NIE"); exit();}
}
else
{
vis[to][b^]=,v[to][b^]=e[i].dis-v[a][b];
qx.push(to); qy.push(b^);
}
}
}
ll L=,R=val[x],sum1=,sum2=;
for(int i=;i<=tot;i++)
{
int a=q[i];
if(vis[a][]) L=max(L,-v[a][]),R=min(R,val[a]-v[a][]);
if(vis[a][]) L=max(L,v[a][]-val[a]),R=min(R,v[a][]);
if(vis[a][]&&vis[a][])
{
if((v[a][]-v[a][])&) {printf("NIE"); exit();}
L=max(L,(v[a][]-v[a][])>>);
R=min(R,(v[a][]-v[a][])>>);
}
}
if(L>R) {printf("NIE"); exit();}
for(int i=;i<=tot;i++)
{
int a=q[i];
if(vis[a][]) sum1+=val[a]-L-v[a][],sum2+=val[a]-R-v[a][];
else sum1+=val[a]+L-v[a][],sum2+=val[a]+R-v[a][];
}
if(sum1>sum2) swap(sum1,sum2);
ans1+=sum1,ans2+=sum2;
} int main()
{
n=read(); m=read();
for(int i=;i<=n;i++) val[i]=read();
for(int i=;i<=m;i++)
{
int x=read(),y=read(),z=read();
add(x,y,z); add(y,x,z);
}
for(int i=;i<=n;i++)
if(!vis[i][]&&!vis[i][])
bfs(i);
printf("%lld %lld",ans1,ans2);
return ;
}
[POI2012] BEZ-Minimalist Security的更多相关文章
- 【BZOJ2801】[Poi2012]Minimalist Security BFS
[BZOJ2801][Poi2012]Minimalist Security Description 给出一个N个顶点.M条边的无向图,边(u,v)有权值w(u,v),顶点i也有权值p(i),并且对于 ...
- bzoj 2801 [Poi2012]Minimalist Security 设一个,求出所有
题目大意 给出一个N个顶点.M条边的无向图,边(u,v)有权值w(u,v),顶点i也有权值p(i), 并且对于每条边(u,v)都满足p(u)+p(v)>=w(u,v). 现在要将顶点i的权值减去 ...
- POI2012题解
POI2012题解 这次的完整的\(17\)道题哟. [BZOJ2788][Poi2012]Festival 很显然可以差分约束建图.这里问的是变量最多有多少种不同的取值. 我们知道,在同一个强连通分 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ_2801_[Poi2012]Minimalist Security_dfs树+特判+乱搞
BZOJ_2801_[Poi2012]Minimalist Security_dfs树+特判+乱搞 Description 给出一个N个顶点.M条边的无向图,边(u,v)有权值w(u,v),顶点i也有 ...
- BZOJ2801/洛谷P3544 [POI2012]BEZ-Minimalist Security(题目性质发掘+图的遍历+解不等式组)
题面戳这 化下题面给的式子: \(z_u+z_v=p_u+p_v-b_{u,v}\) 发现\(p_u+p_v-b_{u,v}\)是确定的,所以只要确定了一个点\(i\)的权值\(x_i\),和它在同一 ...
- POI2012 BEZ-Minimalist Security | noi.ac #537 Graph
题目链接:戳我 首先注意这张图有可能不连通!! 然后我们考虑对于每一个联通块,首先任意确定一个点,给它设最终值为x,然后进行搜索.(因为对于一个联通块而言,我们知道一个点的最终值,那么整个联通块上面点 ...
- Security Policy:行级安全(Row-Level Security)
行级安全RLS(Row-Level Security)是在数据行级别上控制用户的访问,控制用户只能访问数据库表的特定数据行.断言是逻辑表达式,在SQL Server 2016中,RLS是基于安全断言( ...
- Content Security Policy 入门教程
阮一峰文章:Content Security Policy 入门教程
随机推荐
- 使用apt-get命令,出现“无法获得锁”的问题
参考地址 http://blog.csdn.net/namecyf/article/details/7297168
- 1.0_搭建PHP服务器环境的步骤
a,下载安装一款静态web服务器,ex:HTTPD,IIS; b,下载安装PHP引擎: c,在静态服务器配置一下,声明PHP引擎的存在. 注意,以上三步可以用xampp套件来完成. 启动Apache, ...
- 【文章阅读】Java虚拟机系列学习
总目录: Java虚拟机 - 随笔分类 - 五月的仓颉 - 博客园 http://www.cnblogs.com/xrq730/category/731395.html 已读: Java虚拟机1:什么 ...
- 从global到mooncake迁移SQL Azure
之前遇到了问题,在此备注一下: 因为两个环境基本上可以认为是隔离的,所以迁移过程基本上只有通过导出.导入的方式(也是官方推荐的方式): 1.从global上进行数据库的export操作(扩展名bacp ...
- GRPC使用错误排查记录
1. 编译报错 f.fr.SetReuseFrames undefined (type *http2.Framer has no field or method SetReuseFrames) 该问题 ...
- elastic search安装与本地测试
elastic search安装与本地测试 elastic search是一个全文搜索引擎 教程: 综合:http://www.ruanyifeng.com/blog/2017/08/elastics ...
- C++设计模式 -- 解析和实现
原文地址 http://c.chinaitlab.com/special/sjms/Index.html#a 导航目录 ※ 设计模式解析和实现之一-Factory模式 ※ 设计模式解析和实现之八-C ...
- DRF(4) - 认证、权限组件
一.引入 通过前面三节课的学习,我们已经详细了解了DRF提供的几个重要的工具,DRF充分利用了面向对象编程的思想,对Django的View类进行了继承,并封装了其as_view方法和dispatch方 ...
- shell相关知识
在bash shell中,$( )与` ` (反引号)都是用来做命令替换用(command substitution)的.所谓的命令替换与我们第五章学过的变量替换差不多,都是用来重组命令行:*完成引号 ...
- day3-python的函数及参数
函数式编程最重要的是增强代码的重用性和可读性 1 2 3 4 def 函数名(参数): ... 函数体 ... 函数的定义主要有如下要点: def:表示函数的关键字 函数名:函 ...