COGS1117
差分约束第一题。
所有的条件无非两种不等式
$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的更多相关文章
随机推荐
- WebBrowser与IE的关系,如何设置WebBrowser工作在IE9、10、11模式下?
Web Browser Control – Specifying the IE Version http://www.west-wind.com/weblog/posts/2011/May/21/We ...
- svn1.8 server client eclipse 插件 配置 完全教程
svn毋庸置疑,广受欢迎的版本管理软件,我们这里以1.8.10版本为例 本文分三部分 第一部分,服务器端svn安装与配置 第二部分,eclipse下svn插件安装与配置 第三部分,客户端svn简单介绍 ...
- jqMobile中pageinit,pagecreate,pageshow等函数的执行顺序
常见的共有5个page函数,刚开始有点迷糊的是到底谁先谁后执行. 实验告诉我们结果: var temp = ''; $('body').live('pagechange', function () { ...
- 1018LINUX中crontab的用法
转自http://blog.csdn.net/ethanzhao/article/details/4406017#comments 基本格式 :* * * * * command分 时 日 月 周 命 ...
- extjs store的操作
先来个声明,看着不错,贴过来的,没都测试过. Store.getCount()返回的是store中的所有数据记录,然后使用for循环遍历整个store,从而得到每条记录. 除了使用getCount() ...
- “Ceph浅析”系列之二——Ceph概况
本文将对Ceph的基本情况进行概要介绍,以期读者能够在不涉及技术细节的情况下对Ceph建立一个初步印象. 1. 什么是Ceph? Ceph的官方网站Ceph.com上用如下这句话简明扼要地定义了Cep ...
- 线性回归&&code
# -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt from certifi import __mai ...
- puppet的配置
1时间问题 agent与master端务必要保持时间的一致性,最好使用ntp服务 检查ntp服务是否安装 [root@master-elk ~]# rpm -qa|grep ntp ntpdate-. ...
- 【收藏】Android AutoLayout全新的适配方式, 堪称适配终结者
来源:http://blog.csdn.net/lmj623565791/article/details/49990941 更多:Android屏幕适配全攻略(最权威的Google官方适配指导) 一. ...
- windows无法安装到这个磁盘怎样解决
装操作系统,出提示:windows无法安装到这个磁盘.这台计算机的硬件可能不支持启动到此盘.你甚至用专业的分区软件都无法解决这个问题,比如说PM等.一般在更换好新的硬盘的时候或者将操作系统装入移动硬盘 ...