COGS1117
2016-09-01 21:10
197 查看
传送门:
差分约束第一题。
所有的条件无非两种不等式
$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,因为如果最小的距离是无穷大那么显然取任何值都可以。
View Code
差分约束第一题。
所有的条件无非两种不等式
$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 MAXN=1e5+5; const int oo=0x3f3f3f3f; inline ll read(){ char ch=getchar();ll x=0,f=1; while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } ll N,Ma,Mb,LINK[MAXN],len=0,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,1,Ma){ ll x=read(),y=read(),dist=read(); if(x>y)swap(x,y); insert(x,y,dist); } up(i,1,Mb){ int x=read(),y=read(),dist=read(); if(x>y)swap(x,y); insert(y,x,-dist); } up(i,2,N)insert(i,i-1,0); } void SPFA(){ memset(vis,0,sizeof(vis)); memset(cnt,0,sizeof(cnt)); up(i,1,N)dis[i]=oo; dis[1]=0;vis[1]=1; head=1;tail=0;q[++tail]=1; 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(0); } cnt[e[i].y]++; q[++tail]=e[i].y; vis[e[i].y]=1; } } vis[node]=0; } } void output(){ if(dis ==oo)dis =-2; cout<<dis <<endl; } } int main(){ //freopen(FILE".in","r",stdin); //freopen(FILE".out","w",stdout); //freopen("input.in","r",stdin); using namespace solution; init(); SPFA(); output(); return 0; }
View Code
相关文章推荐
- jvm性能调优都做了什么
- 深度学习/神经神经网络常用激活函数总结
- 面试的准备期(一)
- 多线程调试
- UVALive 6604 Airport Sort(逆序对+贪心)
- 图像处理书籍笔记1--基本图像处理运算1
- 每日一JAVA----------JAR命令
- MyBatis数据持久化 SQL复用(可重用的 SQL 代码段)
- MIT 6.00 1x Lecture 3 - Simple Algorithms 简单算法 学习笔记
- 用mysqlbinlog工具查看
- 【bzoj1015】星球大战starwar
- MyBatis数据持久化 SQL复用(可重用的 SQL 代码段)
- Linux常用命令大全
- 流技术总结
- 【鹅厂手游安全部门电话一面】
- 嵌入式必须了解的一些知识
- 初探appium之环境搭建
- 事件冒泡的应用——jq on的实现
- oracle-gi安装
- 涂鸦移动二面