- 和人類同樣,奶牛們在打飯的時候喜歡和朋友站得很近。
- 約翰的編號爲
到
的
只奶牛正打算排隊打飯。如今請你來安排她們,讓她們在數軸上排好隊。奶牛的彈性很好,同一個座標能夠站無限只奶牛,排隊的順序必須和她們編號的順序一致。有
對奶牛互相愛慕,她們之間的距離不能超過必定的值,有
對奶牛互相敵視,她們的距離不能小於必定的值。
- 那麼,首尾奶牛的最大距離是多少呢?
- 和人類同樣,奶牛們在打飯的時候喜歡和朋友站得很近。
- 約翰的編號爲
到
的
只奶牛正打算排隊打飯。如今請你來安排她們,讓她們在數軸上排好隊。奶牛的彈性很好,同一個座標能夠站無限只奶牛,排隊的順序必須和她們編號的順序一致。有
對奶牛互相愛慕,她們之間的距離不能超過必定的值,有
對奶牛互相敵視,她們的距離不能小於必定的值。
- 那麼,首尾奶牛的最大距離是多少呢?
若是沒有合理方案,輸出
,若是首尾兩頭牛的距離能夠無限大,輸出
,不然輸出一個整數表示首尾奶牛的最大距離。c++
樣例
樣例輸入
4 2 1
1 3 10
2 4 20
2 3 3
樣例輸出
27
題解
- 本題目是差分約束的板子題,若是差分約束有疑問,先複習,,,
- 中間的swap緣由是咱們要從序號低的點向序號大的點建正邊,然後邊那個是從高序號到低序號建負邊,
- 因爲牛必須按順序站因此必須建相鄰邊,
- 再建一個超級源點,判斷全圖是否聯通,由於1可能沒法連到全部的點。
- 對於建相鄰邊的狀況舉一例子,你們手動模擬:
4 1 1
1 4 10
2 3 20
-------
-1
code
#include <bits/stdc++.h>
using namespace std;
const int maxn=5000;
const int INF=0x3f3f3f3f;
struct edge{
int to,dis,next;
}e[maxn<<2];
inline int read(){
int k=0,f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') ch=getchar();
for(;isdigit(ch);ch=getchar()) k=k*10+ch-'0';
return k*f;
}
int head[maxn];
int cnt=0;
inline void add(int x,int y,int z){e[++cnt]=(edge){y,z,head[x]},head[x]=cnt;}
int flag=0;int n;
int d[maxn],tot[maxn],vis[maxn];
void spfa(int s){
queue<int>q;
flag=0;
memset(d,0x3f,sizeof(d));
q.push(s);vis[s]=1;d[s]=0;
while(!q.empty()){
int u=q.front();q.pop();
vis[u]=0;
for(int i=head[u];i;i=e[i].next){
int v=e[i].to,dis;
if(d[v]>(dis=d[u]+e[i].dis)){
d[v]=dis;
if(!vis[v]) vis[v]=1,q.push(v);
}
}
if(++tot[u]>n) return flag=-1,void();
}
}
int main(){
n=read();int M=read(),K=read();int x,y,z;
for(int i=1;i<=n;i++)add(0,i,0);
for(int i=1;i<n;i++)add(i+1,i,0);
for(int i=1;i<=M;i++){x=read(),y=read(),z=read();if(x>y)swap(x,y);add(x,y,z);}
for(int i=1;i<=K;i++){x=read(),y=read(),z=read();if(x>y)swap(x,y);add(y,x,-z);}
spfa(0);
if(flag==-1) return cout<<-1<<endl,0;
spfa(1);
if (d[n]==INF) return printf("-2\n"),0;
else return printf("%d\n",d[n]),0;
return 0;
}