題意:有n頭牛,他們按順序排成了一排,有些牛關係比較好,他們的距離不能超過某個距離,還有些牛關係不好,他們之間的距離不能小於某個距離,可能會有多頭牛擠在同一位置上,問1號牛和n號牛之間的最大距離是多少,如果不存在滿足條件的排列則輸出-1,如果距離無限大則輸出-2.
分析:令d[i]表示第i頭牛的位置,因為牛按順序排列,則有d[i] <= d[i+1],關係好的牛有d[a] +d >= d[b], 關係不好的牛有d[a] + d <= d[b],把不等式標準化之後直接跑最短路即可。
如果無限大則輸出-2(第n條牛隨意排的意思),不存在排列輸出-1(不滿足條件,即存在負環).
**:
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
const
int maxn =1000+5;
const
int inf =0x3f3f3f3f;
int head[maxn],d[maxn],vis[maxn],cnt,n,l,d,num[maxn];
queue
q;void init()
struct edge
; edge(int _v, int _w, int _next)
}e[30000+10];
void add_edge(int u, int v, int w)
int spfa()}}
}return d[n]==inf ? -2: d[n];
}int main()
for(int i=0; iscanf("%d %d %d",&a,&b,&c);
add_edge(b,a,-c);
}printf("%d\n",spfa());
}return
0;}
POJ 3169 差分約束
題意 好久沒做差分約束了,看到這道題第一想法是貪心 思路 差分約束 從i到i 1的距離 0 add i 1,i,0 對於互相討厭的牛從u到v的距離 d add v,u,d 對於互相喜歡的牛從u到v的距離 d add u,v,d 跑spfa就好了 順便判判dis 和入隊次數 by siriusren ...
poj3169 差分約束
關於差分約束,我強推這位大佬的部落格。題目是有的牛互相之間最多只能有乙個距離,有的牛最少要達到乙個距離。很容易寫出不等式,由於是要求最大值,所以是要化為小於等於號,求最短路。f i 表示i只牛在哪個位置 0 f b f a d f b f a d 等價於f a f b 0 f b f a d f a...
POJ 3169 差分約束
題意 n頭牛,按照編號從左到右排列,兩頭牛可能在一起,接著有一些關係表示第a頭牛與第b頭牛相隔最多與最少的距離,最後求出第一頭牛與最後一頭牛的最大距離是多少,如 果最大距離無限大則輸出 2,如果關係不能保證則輸出 1 題解 差分約束的入門題 差分約束就是如果dis b dis a c轉化為a到b建一...