CF1450E 资本主义Capitalism(差分约束)
题面
没有永远的朋友,只有永远的利益
在这个黑漆漆的社会上,有
n
n
n 个布衣百姓,他们在利益驱使下成为金钱的奴隶,看不到属于生活的阳光。在茫茫奔途中,他们相互扶持,结交了有
m
m
m 对朋友关系。
奈何这是个资本主义社会,虽然这
n
n
n 个人没有人失业,每个人分别有
a
i
a_i
ai 的月薪,但是如果两个人
i
,
j
i,j
i,j 满足
a
j
=
a
i
+
1
a_j=a_i+1
aj=ai+1 ,也就是说
j
j
j 的月薪刚好比
i
i
i 的大 1,那么
i
i
i 就会觊觎
j
j
j 的成功。
每一对朋友关系中,总有一个人觊觎另一个人,明里交好,暗里嫉妒。
这个社会的收入不平等度定义为
max
a
i
−
min
a
i
\max a_i-\min a_i
maxai−minai 。目前已知所有的朋友关系,和部分朋友关系中的嫉妒方向,以及一个范围:
0
≤
a
i
≤
1
0
6
0\leq a_i\leq 10^6
0≤ai≤106 。没错,在利益驱使的剥削下,有的人的月薪可以达到 0 。事实上,这算比较幸运的。
也就是你,看透了这个社会的弊病,大呼着“生活万岁”,把迷茫走失的人们拉回正轨。为了详细地了解这个社会,你打算:求出最大可能的收入不平等度,以及此时可能的每个人的月薪是多少。可能无解。
1
≤
n
≤
200
,
n
−
1
≤
m
≤
2
000
1\leq n\leq 200,n-1\leq m\leq2\,000
1≤n≤200,n−1≤m≤2000 .
输入
第一行两个数
n
,
m
n,m
n,m。
接下来
m
m
m 行,每行三个数
i
,
j
,
b
i,j,b
i,j,b ,表示
i
,
j
i,j
i,j 之间有朋友关系。
b
∈
{
0
,
1
}
b\in\{0,1\}
b∈{0,1} ,如果
b
=
1
b=1
b=1 ,则
i
i
i 是嫉妒
j
j
j 的(
a
j
=
a
i
+
1
a_j=a_i+1
aj=ai+1),如果
b
=
0
b=0
b=0 ,则两个人的嫉妒方向不确定。
保证不存在重复的
(
i
,
j
)
(i,j)
(i,j),假设每个朋友关系是条无向边,那么这保证是个连通图。
题解
正解是差分约束,想不到?其实应该比较明显的,反正我想不到。
两种情况,两种连边:
- b
=
1
b=1
b=1 :是一个相等关系
a
j
=
a
i
+
1
a_j=a_i+1
aj=ai+1 ,我们把它拆成
a
j
≤
a
i
+
1
a_j\leq a_i+1
aj≤ai+1 和
a
i
≤
a
j
−
1
a_i\leq a_j-1
ai≤aj−1 。
- b
=
0
b=0
b=0 :即
∣
a
i
−
a
j
∣
=
1
|a_i-a_j|=1
∣ai−aj∣=1 ,姑且先把它看作
∣
a
i
−
a
j
∣
≤
1
|a_i-a_j|\leq 1
∣ai−aj∣≤1 ,然后转化为
a
j
≤
a
i
+
1
a_j\leq a_i+1
aj≤ai+1 和
a
i
≤
a
j
+
1
a_i\leq a_j+1
ai≤aj+1 。
然后跑
F
l
o
y
d
\rm Floyd
Floyd ,如果任意一个
f
i
,
i
<
0
f_{i,i}<0
fi,i<0 ,说明有负环,则无解。
接下来找一个起点
i
i
i ,使得在满足
∀
(
u
,
v
)
∈
E
,
f
i
,
u
≠
f
i
,
v
\forall (u,v)\in E~,~f_{i,u}\not=f_{i,v}
∀(u,v)∈E , fi,u=fi,v 以及
∀
j
∈
[
1
,
n
]
,
f
i
,
j
≥
0
\forall j\in[1,n]~,~f_{i,j}\geq 0
∀j∈[1,n] , fi,j≥0 的前提下,
max
f
i
,
.
.
.
−
min
f
i
,
.
.
.
\max f_{i,...}-\min f_{i,...}
maxfi,...−minfi,... 最大。如果找不到这样的
i
i
i 则无解。找到这个
i
i
i 后,就令
a
j
=
f
i
,
j
a_j=f_{i,j}
aj=fi,j 就是了。
最后对于第二种连边,有的人可能会问,没有强制不相等的情况下差分约束,会不会漏掉一些合法情况?实际上不会,如果存在一种情况使得
f
i
,
u
≠
f
i
,
v
f_{i,u}\not=f_{i,v}
fi,u=fi,v 的话,由于差分约束的性质,因为我们没有连 0 边,一定能使其中一个更小。
CODE
#include<map>
#include<queue>
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 205
#define ENDL putchar('\n')
#define LL long long
#define DB double
#define lowbit(x) ((-x) & (x))
LL read() {
LL f = 1,x = 0;char s = getchar();
while(s < '0' || s > '9') {if(s=='-')f = -f;s = getchar();}
while(s >= '0' && s <= '9') {x=x*10+(s-'0');s = getchar();}
return f * x;
}
int n,m,i,j,s,o,k;
int ed[MAXN][MAXN];
int g[MAXN][MAXN];
int main() {
n = read();m = read();
for(int i = 1;i <= n;i ++) {
for(int j = 1;j <= n;j ++) g[i][j] = 1000000;
g[i][i] = 0;
}
for(int i = 1;i <= m;i ++) {
s = read();o = read();k = read();
if(k == 1) { // ai = aj-1 , aj <= ai+1 ^ ai <= aj-1
g[s][o] = 1; g[o][s] = -1;
}
else { // ai <= aj+1 ^ aj <= ai+1
g[s][o] = 1; g[o][s] = 1;
}
ed[s][o] = ed[o][s] = 1;
}
for(int k = 1;k <= n;k ++) {
for(int i = 1;i <= n;i ++) {
for(int j = 1;j <= n;j ++) {
g[i][j] = min(g[i][j],g[i][k] + g[k][j]);
}
}
}
for(int i = 1;i <= n;i ++) {
if(g[i][i] < 0) {
printf("NO\n");return 0;
}
}
int as = 0,ans = -1;
for(int i = 1;i <= n;i ++) {
bool flag = 1;
for(int s = 1;s <= n;s ++) {
for(int o = 1;o <= n;o ++) {
if(ed[s][o] && g[i][s] == g[i][o]) flag = 0;
}
}
if(!flag) continue;
int mi = 1000000,ma = 0;
for(int j = 1;j <= n;j ++) {
mi = min(mi,g[i][j]);
ma = max(ma,g[i][j]);
}
if(mi < 0) continue;
if(ans < ma-mi) {
ans = ma-mi; as = i;
}
}
if(!as) {printf("NO\n");return 0;}
printf("YES\n%d\n",ans);
for(int i = 1;i <= n;i ++) printf("%d ",g[as][i]);ENDL;
return 0;
}
CF1450E 资本主义Capitalism(差分约束)的更多相关文章
- Candies-POJ3159差分约束
Time Limit: 1500MS Memory Limit: 131072K Description During the kindergarten days, flymouse was the ...
- poj3159 差分约束 spfa
//Accepted 2692 KB 1282 ms //差分约束 -->最短路 //TLE到死,加了输入挂,手写queue #include <cstdio> #include & ...
- ZOJ 2770火烧连营——差分约束
偶尔做了一下差分约束. 题目大意:给出n个军营,每个军营最多有ci个士兵,且[ai,bi]之间至少有ki个士兵,问最少有多少士兵. ---------------------------------- ...
- POJ 2983 Is the Information Reliable? 差分约束
裸差分约束. //#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #i ...
- 2014 Super Training #6 B Launching the Spacecraft --差分约束
原题:ZOJ 3668 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3668 典型差分约束题. 将sum[0] ~ sum ...
- POJ 1364 King --差分约束第一题
题意:求给定的一组不等式是否有解,不等式要么是:SUM(Xi) (a<=i<=b) > k (1) 要么是 SUM(Xi) (a<=i<=b) < k (2) 分析 ...
- [USACO2005][POJ3169]Layout(差分约束)
题目:http://poj.org/problem?id=3169 题意:给你一组不等式了,求满足的最小解 分析: 裸裸的差分约束. 总结一下差分约束: 1.“求最大值”:写成"<=& ...
- ShortestPath:Layout(POJ 3169)(差分约束的应用)
布局 题目大意:有N头牛,编号1-N,按编号排成一排准备吃东西,有些牛的关系比较好,所以希望他们不超过一定的距离,也有一些牛的关系很不好,所以希望彼此之间要满足某个关系,牛可以 ...
- 【BZOJ】2330: [SCOI2011]糖果(差分约束+spfa)
http://www.lydsy.com/JudgeOnline/problem.php?id=2330 差分约束运用了最短路中的三角形不等式,即d[v]<=d[u]+w(u, v),当然,最长 ...
随机推荐
- 使用 KubeKey 搭建 Kubernetes/KubeSphere 环境的"心路(累)历程"
目录 今天要干嘛? 在哪里干? 从哪里开始干? 快速开干! 解决依赖问题再继续干! 如何干翻重来? 连着 KubeSphere 一起干! 干不过,输了. 重整旗鼓,继续干! 再次重整旗鼓,继续干! 一 ...
- ER图/模型转换为关系模型
ER图中的主要成分是实体类型和联系类型,转换规则就是如何把实体类型.联系类型转换成关系模式. 1. 二元联系转换 规则1.1(实体类型的转换):将每个实体类型转换成一个关系模式,实体的属性即为关系模式 ...
- USB机械键盘改蓝牙键盘
手里有两把机械键盘,一个是IKBC 87键,一个是IKBC POKER II 60键,由于买的比较早,两把键盘均为USB的,使用起来桌面线比较多,碍事,于是开始研究如何改成蓝牙键盘. 首先说一下USB ...
- centos 修改PHP默认版本
命令行输入export PATH=/usr/local/php/bin:$PATH 然后回车.
- 『忘了再学』Shell流程控制 — 38、while循环和until循环介绍
目录 1.while循环 2.until循环 1.while循环 对while循环来讲,只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止.和for循环的第二种格式for((初始 ...
- 有关于weiphp2.00611上传sae的一些注意(图片上传解决方案)
一.安装中注意的事项 安装时使用的系统为weiphp2.0611 版本 1.将所有文件上传到代码库中 2.按照步骤进行安装weiphp,注意在数据库导入的时候需要手动导入. ...
- Python 中多线程共享全局变量的问题
写在前面不得不看的一些P话: Python 中多个线程之间是可以共享全局变量的数据的. 但是,多线程共享全局变量是会出问题的. 假设两个线程 t1 和 t2 都要对全局变量g_num (默认是0)进行 ...
- 关于'utf-8' codec can't decode byte 0xb9 in position 0: invalid start byte报错
今天在使用vscode编译程序时,启动Python服务出现以下错误: 通过网络查找资料可以得知,是由于个人用户名非英文而导致,但是网上并没有说清楚是哪里的名字,以至于很多人会以为是以下地方: 实际上真 ...
- labview从入门到出家4--用事件结构实现运算功能
使用事件结构可以快速定位响应界面的操作事件,如按下,拖动,双击的事件.基本上我们所要实现的所有功能,都可以通过条件结构+事件结构去实现,比如后面进阶篇将会讲到的状态机就是通过条件结构和事件结构组成的. ...
- Entry键值对对象和Map集合遍历键值对方式
我们已经知道,Map中存放的是两种对象,一种称为key(键),一种称为value(值),它们在在IMap 中是一一对应关系, 这一对对象又称做Map 中的一个Entry(项).Entry将键值对的对应 ...