传送门:

差分约束第一题。

所有的条件无非两种不等式

$d[i]-d[j]>=dist$

$d[i]-d[j]<=dist$

然后进行变形

$d[i]-d[j]>=dist$    $=>$  $d[j]<=d[i]-dist$  $=>$ $insert(i,j,-dist)$

$d[i]-d[j]<=dist$    $=>$  $d[i]<=d[j]+dist$   $=>$ $insert(j,i,dist)$

$d[i]+0>=d[i-1]$    $=>$  $insert(i,i-1,0)$

由此可以建图

最后需要注意两个点:

1.如何判断-1?

-1是无解的情况,什么是无解?显然是存在负环的情况。

2.如何判断-2?

当$ans==oo$时,就应输出-2,因为如果最小的距离是无穷大那么显然取任何值都可以。

 //COGS 1117
 //by Cydiater
 //2016.9.1
 #include <iostream>
 #include <cstdio>
 #include <cstdlib>
 #include <cstring>
 #include <string>
 #include <algorithm>
 #include <queue>
 #include <map>
 #include <iomanip>
 #include <cmath>
 #include <ctime>
 using namespace std;
 #define ll long long
 #define up(i,j,n)        for(int i=j;i<=n;i++)
 #define down(i,j,n)        for(int i=j;i>=n;i--)
 #define FILE "layout"
 ;
 const int oo=0x3f3f3f3f;
 inline ll read(){
     ,f=;
     ;ch=getchar();}
     +ch-';ch=getchar();}
     return x*f;
 }
 ll N,Ma,Mb,LINK[MAXN],len=,head,tail,q[MAXN],dis[MAXN],cnt[MAXN];
 bool vis[MAXN];
 struct edge{
     int y,next,v;
 }e[MAXN];
 namespace solution{
     inline void insert(int x,int y,int v){e[++len].next=LINK[x];LINK[x]=len;e[len].y=y;e[len].v=v;}
     void init(){
         N=read();Ma=read();Mb=read();
         up(i,,Ma){
             ll x=read(),y=read(),dist=read();
             if(x>y)swap(x,y);
             insert(x,y,dist);
         }
         up(i,,Mb){
             int x=read(),y=read(),dist=read();
             if(x>y)swap(x,y);
             insert(y,x,-dist);
         }
         up(i,,N)insert(i,i-,);
     }
     void SPFA(){
         memset(vis,,sizeof(vis));
         memset(cnt,,sizeof(cnt));
         up(i,,N)dis[i]=oo;
         dis[]=;vis[]=;
         head=;tail=;q[++tail]=;
         for(;head<=tail;head++){
             int node=q[head];
             for(int i=LINK[node];i;i=e[i].next)
                 if(dis[e[i].y]>dis[node]+e[i].v){
                     dis[e[i].y]=dis[node]+e[i].v;
                     if(!vis[e[i].y]){
                         if(cnt[e[i].y]==N){
                             puts("-1");
                             exit();
                         }
                         cnt[e[i].y]++;
                         q[++tail]=e[i].y;
                         vis[e[i].y]=;
                     }
                 }
             vis[node]=;
         }
     }
     void output(){
         ;
         cout<<dis[N]<<endl;
     }
 }
 int main(){
     //freopen(FILE".in","r",stdin);
     //freopen(FILE".out","w",stdout);
     //freopen("input.in","r",stdin);
     using namespace solution;
     init();
     SPFA();
     output();
     ;
 }

COGS1117的更多相关文章

随机推荐

  1. web性能优化——浏览器相关

    简介 优化是一个持续的过程.所以尽可能的不要有人为的参与.所以能自动化的或者能从架构.框架级别解决的就最更高级别解决. 这样即能实现面对开发人员是透明的.不响应,又能确保所有资源都是被优化过的. 场景 ...

  2. nios II--实验7——数码管IP软件部分

    软件开发 首先,在硬件工程文件夹里面新建一个software的文件夹用于放置软件部分:打开toolsàNios II 11.0 Software Build Tools for Eclipse,需要进 ...

  3. 常用数据库高可用和分区解决方案(2) — MongoDB篇

    MongoDB是当前比较流行的文档型数据库,其拥有易使用.易扩展.功能丰富.性能卓越等特性.MongoDB本身就拥有高可用及分区的解决方案,分别为副本集(Replica Set)和分片(shardin ...

  4. 拼接sql是陷阱

    项目临时新增一个功能,此时我们习惯自己拼接一个sql. 更可怕的是,后期用户要求新增查询条件,甚至有上10个查询条件,这时的拼接更头疼,if append append(" status=@ ...

  5. python环境搭建-Linux系统下python2.6.6升级python3.5.2步骤

    [root@template ~]# python -v # /usr/lib64/python2.6/encodings/utf_8.pyc matches /usr/lib64/python2.6 ...

  6. 使用D3绘制图表(4)--面积图表

    面积图表的绘制就是在曲线图表的基础上做一点小小的改动.其他的代码跟绘制曲线图表没有什么区别,下面有黄色背景颜色的代码就是修改的,是不是很简单,第一句修改的地方就是把之前绘制线的函数(line)改成了绘 ...

  7. nginx 编译参数详解(运维不得不看)

    nginx参数: --prefix= 指向安装目录 --sbin-path 指向(执行)程序文件(nginx) --conf-path= 指向配置文件(nginx.conf) --error-log- ...

  8. 犀牛书的实例代码:给对象添加freeze, hide, 查询descriptors

    /* * Define a properties() method in Object.prototype that returns an * object representing the name ...

  9. CDN 备胎技巧

    如果你使用 CDN 服务,建议准备一个备胎,万一 CDN 服务挂了,可以从自己的服务器上读取: <script src="http://cdn.staticfile.org/jquer ...

  10. lightoj 1074 spfa判断负环

     Extended Traffic Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Sub ...