传送门:

差分约束第一题。

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

$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. java并发:简单面试问题集锦

    多线程:Simultaneous Multithreading,简称SMT. 并行.并发 并行性(parallelism)指两个或两个以上的事件在同一时刻发生,在多道程序环境下,并行性使多个程序同一时 ...

  2. 【活动】写#听云#原创博文 赢取iPhone 6超级大奖

    移动应用的使用量和重要性与日俱增,用户体验的要求也越来越高.与桌面程序相比,移动应用耗电小,速度慢,但手机用户却希望享受到与桌面程序同样的加载速度.那么如何发现移动应用的性能黑洞,优化移动应用性能,这 ...

  3. ArcGIS支持MongoDB数据源

    ArcGIS支持MongoDB数据源 自从NoSQL推出之后,MongoDB就作为比较杰出的代表受到广大用户的推崇,当然,与之而来的大数据的讨论也非常激烈,GIS数据源向来都是以海量来计算,所以,GI ...

  4. LiveSDK初始化/登录时失败的解决办法

    环境描述 Windows 8.1+VS 2013 Update3+Live SDK 5.6 Metro风格的程序,集成LIVE认证 问题描述 如下图,提示Null Reference的异常. 解决办法 ...

  5. 富文本KidnEditor在MVC中的应用

    最近看到很多网站后台都用到了富文本,包括自己所在的公司也是.公司用的KindEditor,所以就讲讲KindEditor.之前我也没学过,所以网上搜了一篇博文,直接转载如下(PS:完全以学习为目的哦~ ...

  6. Oracle 11g 7个压缩包说明

    最初,我以为都要解压.无意间看到的一博客,明白压缩包的含义.哈哈 Oracle11g有多张安装光盘: 文件名称                                              ...

  7. Smarty单模板多缓存

    Smarty单模板多缓存 单模板多缓存 在生成缓存.判断缓存是否存在时,增加第二个参数,会根据第二个参数来确定对应的缓存文件 清除缓存

  8. extJs学习基础3 ajax与php交互

    extJs代码: <script src="build/ext-all.js"></script> <script src="build/p ...

  9. 如何更改IP地址的映射名字

    windows系统下: 在C:\Windows\System32\drivers\etc\hosts里面添加你想对应的域名 如192.168.230.134 weekend110 注意:这要有管理员权 ...

  10. BitmapFactory

    1.以文件流的方式,假设在sdcard下有test.png图片FileInputStream fis = newFileInputStream("/sdcard/test.png" ...