经典题。

经典差分约束模型。

但是

显然这个总长是有上下界的。

直接二分总长,判断有没有负环

如果没有负环好办,有负环就不知道怎么偏了。

因为没有单调性

(如果所有没有单调性的函数图像,都知道往哪里走更优,

岂不是全都可以二分了

但是本题特殊在于,至少还是个区间!

二分左右端点。

负环记录k*mid+b的k,根据k的正负就可以知道哪个方向可能有解。

任意一个负环都可以判断的。

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
#define pb push_back
#define solid const auto &
#define enter cout<<endl
#define pii pair<int,int>
using namespace std;
// #define int long long
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);(fl==true)&&(x=-x);}
template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');}
namespace Modulo{
const int mod=;
il int ad(int x,int y){return x+y>=mod?x+y-mod:x+y;}
il int sub(int x,int y){return ad(x,mod-y);}
il int mul(int x,int y){return (ll)x*y%mod;}
il void inc(int &x,int y){x=ad(x,y);}
il void inc2(int &x,int y){x=mul(x,y);}
il int qm(int x,int y=mod-){int ret=;while(y){if(y&) ret=mul(x,ret);x=mul(x,x);y>>=;}return ret;}
template<class ...Args>il int ad(const int a,const int b,const Args &...args) {return ad(ad(a,b),args...);}
template<class ...Args>il int mul(const int a,const int b,const Args &...args) {return mul(mul(a,b),args...);}
}
// using namespace Modulo;
namespace Miracle{
const int N=;
const ll inf=1e9+;
int n,m1,m2;
struct node{
int fr,nxt,to;
int k,b;
ll val(ll x){
return (ll)k*x+b;
}
}e[N*N];
int hd[N],cnt;
void add(int x,int y,int k,int b){
// cout<<" add "<<x<<" to "<<y<<" k "<<k<<" b "<<b<<endl;
e[++cnt].nxt=hd[x];
e[cnt].to=y;e[cnt].k=k;e[cnt].b=b;
e[cnt].fr=x;
hd[x]=cnt;
}
ll dis[N],pre[N];
int has[N];
bool vis[N];
queue<int>q;
int spfa(ll mid){
memset(dis,0x3f,sizeof dis);
dis[]=;
memset(vis,,sizeof vis);
while(!q.empty()) q.pop();
has[]=;
q.push();
while(!q.empty()){
int x=q.front();q.pop();vis[x]=;
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
if(dis[y]>dis[x]+e[i].val(mid)){
dis[y]=dis[x]+e[i].val(mid);
pre[y]=i;
has[y]=has[x]+;
if(has[y]==n+){
int z=y;
memset(vis,,sizeof vis);
do{
vis[z]=;
z=e[pre[z]].fr;
}while(!vis[z]);
int k=;
int lp=z;
do{
k+=e[pre[z]].k;
z=e[pre[z]].fr;
}while(z!=lp); if(k>){
return ;
}else return -;
} if(!vis[y]){
vis[y]=;
q.push(y);
}
}
}
}
return ;
}
void clear(){
memset(hd,,sizeof hd);cnt=;
}
int main(){
// rd(n);rd(m);
int T;
rd(T);
while(T--){
clear();
rd(n);rd(m1);rd(m2);
for(reg i=;i<n;++i){
add(i,i-,,-);
}
add(,n-,,-);
int a,b,c;
for(reg i=;i<=m1;++i){
rd(a);rd(b);rd(c);
if(a<b){
add(b,a,,-c);
}else{
add(b,a,,-c);
}
}
for(reg i=;i<=m2;++i){
rd(a);rd(b);rd(c);
if(a<b){
add(a,b,,c);
}else{
add(a,b,-,c);
}
}
ll L=n,R=(ll)n*inf;
ll al=R+;
while(L<=R){
ll mid=(L+R)>>;
int lp=spfa(mid);
if(lp==-){
R=mid-;
}else if(lp==){
L=mid+;
}else{
al=mid;R=mid-;
}
}
L=n,R=(ll)n*inf;
ll ar=n-;
while(L<=R){
ll mid=(L+R)>>;
int lp=spfa(mid);
if(lp==-){
R=mid-;
}else if(lp==){
L=mid+;
}else{
ar=mid;L=mid+;
}
}
// cout<<" al "<<al<<" ar "<<ar<<endl;
if(ar<al){
puts("");
}else if(ar==(ll)n*inf){
puts("-1");
}else{
printf("%lld\n",ar-al+);
}
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
*/

二分条件:单调性

一切可以得知最优解方向的,也都可以二分

51nod1340地铁环线的更多相关文章

  1. 题解 [51nod1340]地铁环线

    题解 [51nod1340]地铁环线 题面 解析 本文参考这篇博客 一开始看到只有120行就打算写一写, 结果一刚就是三个星期摆摆摆 本来是当查分约束入门学的. step 1 首先来考虑下如果已知总长 ...

  2. 51nod1340 地铁环线

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1340 设x为环线的长度,要判断某个特定的x是否可行,不难将题目转为差分约 ...

  3. 【51nod 1340】地铁环线

    题目 有一个地铁环线,环线中有N个站台,标号为0,1,2,...,N-1.这个环线是单行线,一共由N条有向边构成,即从0到1,1到2,..k到k+1,...,N-2到N-1,N-1到0各有一条边.定义 ...

  4. [题解] 51 nod 1340 地铁环线

    不难看出这是一道差分约束的题目. 但是如果想按照通常的题目那样去建边的话,就会发现这句话--相邻两站的距离至少是1公里--建边后就直接让整个题出现了负环(默认是按求最短路建边),没法做了. 这时我们就 ...

  5. 【51nod】1340 地铁环线

    今天头非常疼,躲在家里没去机房 反正都要颓废了,然后花了一上午研究了一下这道神题怎么做-- 题解 首先我们发现,如果我们设\(dis[i]\)为从\(0\)节点走到\(i\)节点的距离 那么题目中给出 ...

  6. 【UR #2】跳蚤公路

    [UR #2]跳蚤公路 参照yjc方法.也就是地铁环线那个题. 求每个点不在负环内的x的取值范围.然后所有1到j能到i的j的范围取交.得到答案. 每个边形如kx+b的直线,每个环也是 每个点不在负环内 ...

  7. 【luogu P4005 清华集训2017】小Y和地铁

    题目描述 小 Y 是一个爱好旅行的 OIer.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁. 她发现每条地铁线路可以看成平面上的一条曲线,不同线路的交点处一定会设有 换乘站 . ...

  8. P4005 小 Y 和地铁

    题目描述 小 Y 是一个爱好旅行的 OIer.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁. 她发现每条地铁线路可以看成平面上的一条曲线,不同线路的交点处一定会设有 换乘站 . ...

  9. 华为上机测试题(地铁换乘-java)

    PS:自己写的,自测试OK,供大家参考. /* 高级题样题:地铁换乘描述:已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的.经过的站点名分别如下,两条线交叉的换乘点用T1.T2表示.编写 ...

随机推荐

  1. 【Linux】RedHat换源(转)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 原本链接:https://blog.csdn.net/otmqixi/article/deta ...

  2. Java总结第一期

    神奇的小阳阳阳再度归来,大家一定想我了吧~哦,谢谢,谢谢,谢谢各位的掌声,thank you,thank you@ 第一章: 下面给大家简单介绍Java: Java技术可以应用在几乎所有类型和规模的设 ...

  3. SQLserver查询作业、视图、函数、存储过程中的关键字

    一.查询视图.函数.存储过程中的关键字 SELECT a.name,a.[type],b.[definition] FROM sys.all_objects a,sys.sql_modules b W ...

  4. MacOS Catalina 导致bash命令失效的一些总结

    欢天喜地的升级了最新的OS后,第一个发现bash失效的是使用pod命令出现: -bash: pod: command not found 这个不会导致cocoapods无法正常使用,可以使用绝对路径里 ...

  5. Ant Design Pro (中后台系统)教程

    一.概念:https://pro.ant.design/docs/getting-started-cn(官方网站) 1.Ant Design Pro 是什么:  https://www.cnblogs ...

  6. php 封装原生数据导出的方法(csv文件格式)和csv文件中长数字自动变成科学计数法的处理

    如何解决上图长数字自动转换处理? CSV文件中长数字自动变成科学计数法处理.用程序导出的csv文件,当字段中有比较长的数字字段存在时,在用excel软件查看csv文件时就会变成科学计数法的表现形式. ...

  7. centos清理缓存

    释放网页缓存(To free pagecache): echo 1 > /proc/sys/vm/drop_caches 释放目录项和索引(To free dentries and inodes ...

  8. Ajax二级联动简单实例

    效果图: 图1 图2(浙江省内存在山东省的数据,原因是先前加入的数据未删除) 思路:通过下拉省份,将省份id传入后台,根据省份塞入相应省份的市的数据,将市的数据再次传回前端 前端HTML及JS代码: ...

  9. SAS中的Order By - Proc Sort

    SAS中的Order By - Proc Sort 1.排序proc sort proc sort在按数据集中某一个变量或几个变量的升序或降序将记录重新排列,并把结果保存在输出数据集中,如果不另外指定 ...

  10. python 装饰器 第五步(2):带有返回值得装饰器

    #第五步:带有返回值的装饰器 把第四步复制过来 #用于扩展基本函数的函数 def kuozhan(func): #内部函数(扩展之后的eat函数) def neweat(): #以下三步就是扩展之后的 ...