和人類一樣,奶牛們在打飯的時候喜歡和朋友站得很近。約翰的編號為1
到n
的n
(2
<=n
<=1000
) 只奶牛正打算排隊打飯。現在請你來安排她們,讓她們在數軸上排好隊。奶牛的彈性很好,同乙個座標可以站無限只奶牛,排隊的順序必須和她們編號的順序一致。有m
對奶牛互相愛慕,她們之間的距離不能超過一定的值,有k
對奶牛互相敵視,她們的距離不能小於一定的值 那麼,首尾奶牛的最大距離是多少呢?
第一行輸入n
,m
,k
,(0
<m
,k
<=5000
)。
接下來m
行每行三個整數x
,y
,z
,表示編號為x
和y
的兩頭奶牛之間的距離最大不超過z
。
再接下來k
行每行三個整數a
,b
,c
,表示編號為a
和b
的兩頭奶牛之間的距離最少為c
。
如果沒有合理方案,輸出−1
,如果首尾兩頭牛的距離可以無限大,輸出−2
,否則輸出乙個整數表示首尾奶牛的最大距離。
樣例輸入
4 2 1
1 3 10
2 4 20
2 3 3
樣例輸出
27
裸的差分約束,已經忘得一乾二淨比方說我們有以上幾個不等式,求
x5
−x1
的最大值,直接代入計算就可以,但是要計算機能拿來計算,我們得有乙個規矩點的方法
我們可以通過移項,發現xi
≤xj
+ak
然後可以自然而然地想到求最短路時的鬆弛操作(xi被鬆弛,作為邊的終點),但是這裡符號是反的,這並無大礙,因為我們是求x5
−x1
的最大值,就等於x1
~x5
的最小值(因為要保證所有不等式都成立,同小取小),如果 dis[n] 是無窮大,就表明x5
−x1
可以無窮大,如果出現負環,就表明無解
#include#include#include#include#includeusing namespace std;
int n,m,k;
const int maxn = 1e3+10,maxm = 2e4+10,inf = 0x3f3f3f3f;
int head[maxn],dis[maxn],vis[maxn],cnt[maxn];
struct edgee[maxm];
int len = 0;
void addedge(int u,int v,int w)
int spfa(int x)
}} }
if(dis[n]==inf)return -2;//未被鬆弛,說明距離可以無限大
return dis[n]; //x1-xn的最小值,即為xn-x1的最大值
}int main()
for(int i = 1;i <= k;i++)
for(int i = 1;i <= n;i++)
for(int i = 1;i <= n;i++)
if(spfa(0)==-1)
printf("%d",spfa(1));//有解,求最大值
return 0;
}
POJ 3169 Layout(差分約束)
題目大意 當排隊等候餵食時,奶牛喜歡和它們的朋友站得靠近些。fj有n 2 n 1000 頭奶牛,編號從1到n,沿一條直線站著等候喂 食。奶牛排在隊伍中的順序和它們的編號是相同的。因為奶牛相當苗條,所以可能有兩頭或者更多奶牛站在同一位置上。即使說,如果我們想象奶牛是站在一條數軸上的話,允許有兩頭或更多...
POJ3169 Layout 差分約束)
題意 一堆牛在一條直線上按編號站隊,在同一位置可以有多頭牛並列站在一起,但編號小的牛所佔的位置不能超過編號大的牛所佔的位置,這裡用d i 表示編 號為i的牛所處的位置,即要滿足d i d i 1 0,同時每兩頭牛之間有以下兩種關係 對於輸入的a b d來說 1 如果是喜歡關係 即需要滿足d b d ...
POJ3169 Layout 差分約束
題目鏈結。分析 對於任意i號奶牛,1 id i 1 d i 0 對於每個好感的描述 i,j,k 假設i j,體現到距離上的要求就是 d j d i k 對於每個反感的描述 i,j,k 假設i j,體現到距離上的要求就是 d j d i k 寫成我們約定的形式 d i d i 1 0 d j d i ...