POJ3169 簡單差分約束 記得判負環

2021-08-19 20:22:24 字數 1064 閱讀 2737

題意:有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建一...