[传送门] (https://www.luogu.org/problemnew/show/P2294)

解题思路

  差分约束。先总结一下差分约束,差分约束就是解决一堆不等式混在一起,左边是差的形式,右边是常量,然后要求差最小值最大值或判无解的算法。首先对于下面几个不等式来说:

\[X_0-X_1<=5\\
X_2-X_3>=2\\
X_1-X_3<=1\\
X_0-X_2<=3
\]

  现在我们要求\(X_1-X_3\)的最大值,我们观察第一个式子(其实哪个都行),第一个式子可以变\(X_0<=X_1+5\),这个形式不正是最长路的松弛操作吗。所以我们可以化作图论的模型,对于\(X_2-X_3>=2\)这样的式子,我们只需要在两边同时乘一个\(-1\),也就变成了\(X_2-X_3<=-2\)了。这样的话我们建图,\(X_1\)到\(X_3\)的最长路即为答案。最小值也同理,我们把所有式子化成\(>=\)的形式就行了。

  然后有几个建图的技巧。对于\(X_a-X_b=c\)的形式,我们可以把它拆成两个式子:$ X_a-X_b<=c $ 和 $X_a-X_b>=c $,对于 $ X_a-X_b<c $,我们可以把它变成 $ X_a-X_b<=c-1$的形式。然后注意有的题让判无解,当求最短路的时候出现了负环时就一定无解,因为会不断松弛。因为有负边的存在,所以用 \(spfa\)。

  说一下这道题,这道题比较巧妙。首先给的一堆\([l,r]\)的的收入,我们可以看做一个前缀和的形式。即\(sum[r]-sum[l-1]=k\),\(k\)是一个常数,这就变成上面差分约束的形式了,然后我们判断是否是假的,只需要建好图用\(spfa\)判负环。

代码

\(Atom\)写的,缩进有点奇怪。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue> using namespace std;
const int MAXN = 105;
const int MAXM = 1005; inline int rd(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) {f=ch=='-'?0:1;ch=getchar();}
while(isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return f?x:-x;
} int T,n,m,head[MAXN],cnt,num[MAXN],dis[MAXN];
int to[MAXM<<1],nxt[MAXM<<1],val[MAXM<<1];
bool vis[MAXN],flag;
queue<int> Q; inline void add(int bg,int ed,int w){
to[++cnt]=ed,nxt[cnt]=head[bg],head[bg]=cnt,val[cnt]=w;
} bool spfa(int S){
memset(vis,false,sizeof(vis));
memset(dis,0x3f,sizeof(dis));
memset(num,0,sizeof(num));
Q.push(S);dis[S]=0;vis[S]=1;num[S]=1;
int x,u;
while(!Q.empty()){
x=Q.front();Q.pop();
for(register int i=head[x];i;i=nxt[i]){
u=to[i];
if(dis[x]+val[i]<dis[u]){
dis[u]=dis[x]+val[i];
num[u]=max(num[u],num[x]+1);
if(num[u]>n) return false;
if(!vis[u]) {vis[u]=1;Q.push(u);}
}
}
vis[x]=false;
}
return true;
} inline void init(){
memset(head,0,sizeof(head));
while(Q.size()) Q.pop();
cnt=0;flag=false;
} int main(){
T=rd();
while(T--){
init();
n=rd();m=rd();int x,y,z;
for(int i=1;i<=m;i++){
x=rd(),y=rd(),z=rd();
add(y,x-1,z),add(x-1,y,-z);
}
for(int i=0;i<=n;i++)
if(!spfa(i)) {flag=true;break;}
puts(flag?"false":"true");
}
return 0;
}

LUOGU P2294 [HNOI2005]狡猾的商人(差分约束)的更多相关文章

  1. luogu 2294 [HNOI2005]狡猾的商人 差分约束

    一个差分约束模型,只需判一下有没有负环即可. #include <bits/stdc++.h> #define N 103 #define M 2004 #define setIO(s) ...

  2. [luogu P2294] [HNOI2005]狡猾的商人

    [luogu P2294] [HNOI2005]狡猾的商人 题目描述 输入输出格式 输入格式: 从文件input.txt中读入数据,文件第一行为一个正整数w,其中w < 100,表示有w组数据, ...

  3. BZOJ 1202: [HNOI2005]狡猾的商人( 差分约束 )

    好像很多人用并查集写的... 前缀和, 则 sumt - sums-1 = v, 拆成2条 : sumt ≤ sums-1 + v, sums-1 ≤ sumt - v 就是一个差分约束, 建图跑SP ...

  4. P2294 [HNOI2005]狡猾的商人(差分约束)

    P2294 [HNOI2005]狡猾的商人 对于每个$(x,y,w)$,连边$(x-1,y,w),(y,x-1,-w)$,表示前$y$个月的收益比前$x-1$个月的收益大$w$ 这样题目就转化为询问图 ...

  5. 洛谷P2294 [HNOI2005]狡猾的商人

    P2294 [HNOI2005]狡猾的商人 题目描述 输入输出格式 输入格式: 从文件input.txt中读入数据,文件第一行为一个正整数w,其中w < 100,表示有w组数据,即w个账本,需要 ...

  6. 题解——洛谷P2294 [HNOI2005]狡猾的商人(差分约束)

    裸的差分约束 dfs判断负环,如果有负环就false,否则就是true 注意有多组数据,数组要清空 #include <cstdio> #include <algorithm> ...

  7. 洛谷 [p2294] [HNOI2005] 狡猾的商人

    差分约束做法 又是一道转换成前缀和的差分约束题,已知从s月到t月的收入w,设数组pre[i]代表从开始到第i个月的总收入 构造差分不等式 $ pre[s-1]-pre[t]==w $ 为了满足松弛操作 ...

  8. P2294 [HNOI2005]狡猾的商人

    题目描述 输入输出格式 输入格式: 从文件input.txt中读入数据,文件第一行为一个正整数w,其中w < 100,表示有w组数据,即w个账本,需要你判断.每组数据的第一行为两个正整数n和m, ...

  9. Bzoj1202/洛谷P2294 [HNOI2005]狡猾的商人(带权并查集/差分约束系统)

    题面 Bzoj 洛谷 题解 考虑带权并查集,设\(f[i]\)表示\(i\)的父亲(\(\forall f[i]<i\)),\(sum[i]\)表示\(\sum\limits_{j=fa[i]} ...

随机推荐

  1. webpack4.x的使用历程

    第一次接触的webpack是在一个3.x的资料中 在4.x的运用中遇到了好多的坑,我就以小白的身份把我使用webpaxk的过程分享出来,其中很多不足欢迎大佬们指正 node安装不再赘述 一.安装 np ...

  2. windows 远程登录

    在我的电脑  属性当中开启远程登录功能 然后制作账号,这里对于账号的命名是有要求的,具体网上查找说是要用户名和全名一样,我没有做测试,不过新创建了一个用户用来登录,总是告知我密码错误,导致登录失败,所 ...

  3. PHP算法之罗马数字转整数

    罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1.12 ...

  4. Bribing FIPA

    Bribing FIPA 给出多棵有n个节点的有根树,第i个节点有一个权值\(a_i\),定义一个点能控制的点为其所有的子节点和它自己,询问选出若干个点的最少的权值之和,并且能够控制大于等于m个点,\ ...

  5. 七种数据库中Select Top的使用方法 (只显示数据库的几条记录)

    七种数据库中Select Top的使用方法 1. Oracle数据库  SELECT * FROM TABLENAME WHERE ROWNUM <= N 2. Infomix数据库  SELE ...

  6. ubuntu 16.04 jdk-8u201-linux-x64.tar.gz 安装部署

    都是在普通用户加sudo代替root 1.sudo tar -zxvf jdk-8u201-linux-x64.tar.gz2.sudo chown make:make jdk1.8.0/3.sudo ...

  7. Delphi实现屏幕截图、窗口截图、指定区域截图

    Use Jpeg procedure TForm1.snapscreen(a,b,c,d:Integer); var bmpscreen:Tbitmap; jpegscreen:Tjpegimage; ...

  8. document.body / document.ducumentElement /等获取高度和宽度的区别

    document.body / document.ducumentElement /等获取高度和宽度的区别 <!DOCTYPE html> <html> <head la ...

  9. 测试VPS

    wget freevps.us/downloads/bench.sh -O - -o /dev/null|bash

  10. MySQL数据库中,使用 group by 时,不重复字段如何拼接显示

    就不写文字描述了,直接用图和sql来表述吧. 这是测试数据,表名为 person 现在,我想按照性别进行分组,也就是字段 sex ,同时能将分组后的姓名全部显示出来. sql 语句如下: SELECT ...