P2294 [HNOI2005]狡猾的商人
题目描述
输入输出格式
输入格式:
从文件input.txt中读入数据,文件第一行为一个正整数w,其中w < 100,表示有w组数据,即w个账本,需要你判断。每组数据的第一行为两个正整数n和m,其中n < 100,m < 1000,分别表示对应的账本记录了多少个月的收入情况以及偷看了多少次账本。接下来的m行表示刁姹偷看m次账本后记住的m条信息,每条信息占一行,有三个整数s,t和v,表示从第s个月到第t个月(包含第t个月)的总收入为v,这里假设s总是小于等于t。
输出格式:
输出文件output.txt中包含w行,每行是true或false,其中第i行为true当且仅当第i组数据,即第i个账本不是假的;第i行为false当且仅当第i组数据,即第i个账本是假的。
输入输出样例
2
3 3
1 2 10
1 3 -5
3 3 -15
5 3
1 5 100
3 5 50
1 2 51
true
false
Solution:
本题是思维比较巧妙的差分约束。。。
思路类似于植树那道题,$u\rightarrow v=c$可以理解为$sum[v]-sum[u-1]=c$(前缀和)。
那么对于每个条件我们可以先得出约束条件:$w[u-1,v]=c$表示$sum[v]$比$sum[u-1]$大$c$。
我们直接在这样的图上跑最长路后能求出每个点的$dis$值,但是如何去判断是否合法呢?
先看这张图(手绘勿喷):
此图表示的是$sum[1,3]=1,\;sum[1,2]=1,\;sum[2,3]=1$的情况,显然是不合法的情况,但是我们求出最长路后的$dis$值分别为$dis[1]=0,\;dis[2]=1\;dis[3]=2$,貌似对判断合法没什么用。
不难发现,用少了约束条件,给定的$sum[u\rightarrow v]=c$不仅需要满足$sum[v]-sum[u-1]=c$,还应该满足$sum[u-1]-sum[v]=-c$。
那么我们加入这一约束后,图就变成了这样:
此时,我们由第一张图求得的$dis[1]=0,\;dis[2]=1,\;dis[3]=2$在此图中还可以继续更新,$dis[1]=0$会由$dis[3]$更新变为$dis[1]=1$,然后引发一系列无限制的更新。究其原因,就是因为不满足$sum[u-1]-sum[v]=-c$这一约束条件。
所以我们将两个约束条件都建成边。
再考虑另一个问题,那就是源点不确定,所以我们每次以没有被遍历过的点为源点跑$spfa$求最长路(即使约束条件中没有出现过该点也对答案无影响,因为根本不会由它进行广搜遍历),那么当某个点被重复遍历超过$n$次,则出现了环,说明不可行,否则就是合法的。(事实证明数据比较水,因为我第一遍没有考虑源点不为$0$的情况,但是却$A$了~~)
代码:
#include<bits/stdc++.h>
#define il inline
#define For(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)
using namespace std;
const int N=,inf=;
int T,to[N],tot[N],net[N],h[N],w[N],dis[N],cnt,n,m;
bool vis[N];
queue<int>q; il int gi(){
int a=;char x=getchar();bool f=;
while((x<''||x>'')&&x!='-')x=getchar();
if(x=='-')x=getchar(),f=;
while(x>=''&&x<='')a=(a<<)+(a<<)+x-,x=getchar();
return f?-a:a;
} il void add(int u,int v,int c){to[++cnt]=v,net[cnt]=h[u],h[u]=cnt,w[cnt]=c;} il bool spfa(int s){
For(i,,n)dis[i]=-inf;
q.push(s);dis[s]=;vis[s]=;
while(!q.empty()){
int u=q.front();q.pop();vis[u]=;tot[u]++;
if(tot[u]==n)return ;
for(int i=h[u];i;i=net[i])
if(dis[to[i]]<dis[u]+w[i]){
dis[to[i]]=dis[u]+w[i];
if(!vis[to[i]])q.push(to[i]),vis[to[i]]=;
}
}
return ;
} int main(){
T=gi();
while(T--){
n=gi(),m=gi();
cnt=;
memset(vis,,sizeof(vis));
memset(h,,sizeof(h));
memset(tot,,sizeof(tot));
int u,v,c,f;
while(m--){
u=gi(),v=gi(),c=gi();
add(u-,v,c);add(v,u-,-c);
}
f=;
For(i,,n-){
if(!tot[i]){
if(!spfa(i)){f=;break;}
}
}
if(!f)printf("true\n");
else printf("false\n");
}
return ;
}
P2294 [HNOI2005]狡猾的商人的更多相关文章
- [luogu P2294] [HNOI2005]狡猾的商人
[luogu P2294] [HNOI2005]狡猾的商人 题目描述 输入输出格式 输入格式: 从文件input.txt中读入数据,文件第一行为一个正整数w,其中w < 100,表示有w组数据, ...
- 洛谷P2294 [HNOI2005]狡猾的商人
P2294 [HNOI2005]狡猾的商人 题目描述 输入输出格式 输入格式: 从文件input.txt中读入数据,文件第一行为一个正整数w,其中w < 100,表示有w组数据,即w个账本,需要 ...
- P2294 [HNOI2005]狡猾的商人(差分约束)
P2294 [HNOI2005]狡猾的商人 对于每个$(x,y,w)$,连边$(x-1,y,w),(y,x-1,-w)$,表示前$y$个月的收益比前$x-1$个月的收益大$w$ 这样题目就转化为询问图 ...
- LUOGU P2294 [HNOI2005]狡猾的商人(差分约束)
[传送门] (https://www.luogu.org/problemnew/show/P2294) 解题思路 差分约束.先总结一下差分约束,差分约束就是解决一堆不等式混在一起,左边是差的形式,右边 ...
- 洛谷 [p2294] [HNOI2005] 狡猾的商人
差分约束做法 又是一道转换成前缀和的差分约束题,已知从s月到t月的收入w,设数组pre[i]代表从开始到第i个月的总收入 构造差分不等式 $ pre[s-1]-pre[t]==w $ 为了满足松弛操作 ...
- 题解——洛谷P2294 [HNOI2005]狡猾的商人(差分约束)
裸的差分约束 dfs判断负环,如果有负环就false,否则就是true 注意有多组数据,数组要清空 #include <cstdio> #include <algorithm> ...
- Bzoj1202/洛谷P2294 [HNOI2005]狡猾的商人(带权并查集/差分约束系统)
题面 Bzoj 洛谷 题解 考虑带权并查集,设\(f[i]\)表示\(i\)的父亲(\(\forall f[i]<i\)),\(sum[i]\)表示\(\sum\limits_{j=fa[i]} ...
- [HNOI2005]狡猾的商人 ,神奇做法——贪心
洛谷P2294 [HNOI2005]狡猾的商人 ,神奇做法--贪心 看到大牛都是写的差分约束或带权并查集,本蒟蒻都不太会(还是用差分约束过了的QAQ),但是想出一种贪心的策略,运用神奇的优先队列实现. ...
- [BZOJ1202][HNOI2005]狡猾的商人
[BZOJ1202][HNOI2005]狡猾的商人 试题描述 刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的.账本上记录了n个月以来的收入情况,其中第i 个月的收入额为Ai(i= ...
随机推荐
- 使用免费公开的api接口示例(iOS)
做项目难免需要测试,要测试就需要一些接口,现在网上的很多接口都是需要收费的. 以下是目前找到的免费 JSON API免费接口 云聚数据 网吧数据 其中选取了一个百度百科的接口 百度接口 百度百科接口: ...
- top小火箭
// my.js function $(id){return document.getElementById(id)};function show(obj){obj.style.display = & ...
- django连接mysql数据库配置,出现no module named mysqldb报错
作为一个菜鸟运维也是要有梦想的,万一学会了python走向人生巅峰了呢.好吧,都是瞎想,今天主要介绍下django配置,最近也开始摸索这个牛b框架了,当然大佬肯定不屑一顾,都是照顾照顾我们这些菜鸟初学 ...
- 判断StringBuilder 是否为空
if("".equals(stringbuilder.toString())) do..
- php集成开发环境xampp的搭建
一:运维闲谈 作为一名linux运维工程师,在确保能够有熟练的服务器的搭建和维护优化技能的前提,还需对自身解决问题方法上做出一番功夫. 如何为自己的运维工作添砖加瓦,自动化运维便变得非常重要,一方面, ...
- 无法打开物理文件 XXX.mdf“,操作系统错误 5:”5(拒绝访问。)"的解决办法
http://blog.csdn.net/blackfield/article/details/6550499 用T-SQL命令附加数据库时,出现如下异常信息: 无法打开物理文件 XXX.mdf&qu ...
- Nginx 配置继承模型
要了解nginx的继承模型,首先需要知道nginx使用多个配置块进行操作.在nginx中,这样的块被称为上下文,例如,放置在服务器上下文中的配置指令驻留在server { }块中,就像放置在http上 ...
- mysql悲观锁与乐观锁
简介 数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性. 用途 乐观锁和悲观锁是并发控制主要采用的技术手段.无论是悲观 ...
- 归并排序算法Java实现
一. 算法描述 归并排序采用了分治策略(divide-and-conquer),就是将原问题分解为一些规模较小的相似子问题,然后递归解决这些子问题,最后合并其结果作为原问题的解. 归并排序将待排序数组 ...
- 15,redis基础学习
redis Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件 yum安装redis 1.yum安装 #前提得配置好阿里云yum源,epel源 #查看 ...