一张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的更多相关文章

  1. 【BZOJ2801】[Poi2012]Minimalist Security BFS

    [BZOJ2801][Poi2012]Minimalist Security Description 给出一个N个顶点.M条边的无向图,边(u,v)有权值w(u,v),顶点i也有权值p(i),并且对于 ...

  2. 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的权值减去 ...

  3. POI2012题解

    POI2012题解 这次的完整的\(17\)道题哟. [BZOJ2788][Poi2012]Festival 很显然可以差分约束建图.这里问的是变量最多有多少种不同的取值. 我们知道,在同一个强连通分 ...

  4. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  5. BZOJ_2801_[Poi2012]Minimalist Security_dfs树+特判+乱搞

    BZOJ_2801_[Poi2012]Minimalist Security_dfs树+特判+乱搞 Description 给出一个N个顶点.M条边的无向图,边(u,v)有权值w(u,v),顶点i也有 ...

  6. 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\),和它在同一 ...

  7. POI2012 BEZ-Minimalist Security | noi.ac #537 Graph

    题目链接:戳我 首先注意这张图有可能不连通!! 然后我们考虑对于每一个联通块,首先任意确定一个点,给它设最终值为x,然后进行搜索.(因为对于一个联通块而言,我们知道一个点的最终值,那么整个联通块上面点 ...

  8. Security Policy:行级安全(Row-Level Security)

    行级安全RLS(Row-Level Security)是在数据行级别上控制用户的访问,控制用户只能访问数据库表的特定数据行.断言是逻辑表达式,在SQL Server 2016中,RLS是基于安全断言( ...

  9. Content Security Policy 入门教程

    阮一峰文章:Content Security Policy 入门教程

随机推荐

  1. django用户认证系统——基本设置1

    网站提供登录.注册等用户认证功能是一个常见的需求.因此,Django 提供了一套功能完整的.灵活的.易于拓展的用户认证系统:django.contrib.auth.在本教程中,我将向你展示 auth ...

  2. Spring框架中的AOP技术----配置文件方式

    1.AOP概述 AOP技术即Aspect Oriented Programming的缩写,译为面向切面编程.AOP是OOP的一种延续,利用AOP技术可以对业务逻辑的各个部分进行隔离,从使得业务逻辑各部 ...

  3. 多线程的设计模式--Future模式,Master-Worker模式,生产者-消费者模式

    代码示例: public interface Data { String getRequest(); } public class FutureData implements Data{ privat ...

  4. cdr X6 64位32位缩略图补丁包

    cdr X6 64位32位缩略图补丁包下载 安装了X6没有缩略图的话,点击下面链接下载安装插件即可 点击下载

  5. 机械迷城MAC下载及攻略

    点击下载 无意间在verycd上看到这个游戏,很好玩的一个游戏. 画风非常可爱,有点复古风. 这里是 机械迷城 的专题频道 http://pc.pcgames.com.cn/pczq/jxmc/

  6. 手动爬虫之京东笔记本栏(ptyhon3)

    import urllib.request as ur import urllib.error as ue import re # 目标网址 url = 'https://list.jd.com/li ...

  7. 【转】Spring中@Component的作用

    今天在写程序的时候看见一个以前没有见过的注解(@Component),在网上查找过后,经过实践,决定把它记录下来. 1.@controller 控制器(注入服务) 用于标注控制层,相当于struts中 ...

  8. spring 实现定时任务

    spring实现定时任务超级简单.比使用quartz简单,比使用timer强大.如下是一个简单的springboot任务,启用了定时任务 @SpringBootApplication@Componen ...

  9. mysql数据库表插入单条数据/批量插入数据

    1.创建表格 reate table trade( id int(4) not null primary key auto_increment, product varchar(30) null, p ...

  10. Spring-Spring IoC容器

    IoC容器 Spring容器是Spring框架的核心.容器将创建对象,把它们连接在一起,配置它们,并管理它们的整个生命周期从创建到销毁.Spring容器使用依赖注入(DI)来管理组成一个应用程序的组件 ...