传送门:

差分约束第一题。

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

$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. 让计算机崩溃的python代码,求共同分析

    在现在的异常机制处理的比较完善的编码系统里面,让计算机完全崩溃无法操作的代码还是不多的.今天就无意运行到这段python代码,运行完,计算机直接崩溃,任务管理器都无法调用,任何键都用不了,只能强行电源 ...

  2. 【技巧】“Plugin execution not covered by lifecycle configuration...“异常的处理

    问题现象: 在Eclipse(JEE mars)中新建maven project,选择archetype为:maven-archetype-plugin,结果生成的project存在错误:“Plugi ...

  3. java中的@Override标签,小细节大作用

    转载:http://www.cnblogs.com/octobershiner/archive/2012/03/09/2388370.html 一般用途                         ...

  4. alpha版本冲刺总结

    小组:The Expendables 一.项目预期计划 1.基本完成所有界面设计 2.基本完成所有功能设计(导入导出excel表格,搜索功能,文件选择功能,连接服务器等...) 3.基本完成服务器搭建 ...

  5. Linux chkconfig命令

    chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法:chkconfig [--ad ...

  6. Java学习之ConcurrentHashMap实现一个本地缓存

    ConcurrentHashMap融合了Hashtable和HashMap二者的优势. Hashtable是做了线程同步,HashMap未考虑同步.所以HashMap在单线程下效率较高,Hashtab ...

  7. 【CodeVS 1993】草地排水 isap模板题

    开始网络流的学习,更新一下isap的模板 #include<cstdio> #include<cstring> #include<algorithm> #defin ...

  8. 【codevs 1565】【SDOI 2011】计算器 快速幂+拓展欧几里得+BSGS算法

    BSGS算法是meet in the middle思想的一种应用,参考Yveh的博客我学会了BSGS的模版和hash表模板,,, 现在才会hash是不是太弱了,,, #include<cmath ...

  9. css3-新属性-用户界面

    多列:(对文本进行布局,像报纸那样) column-count: 规定元素应该被分隔得列数: column-gap:规定列之间的间距: column-rule: 列与列之间的间隔线: column-w ...

  10. java-汉字转换拼音-pinyin4j.jar

    使用pinyin4j将汉字转成拼音,附件为pinyin4j的jar包 import net.sourceforge.pinyin4j.PinyinHelper; import net.sourcefo ...