您的位置:首页 > 其它

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,因为如果最小的距离是无穷大那么显然取任何值都可以。

//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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: