HDU 3592(差分約束)

2021-09-25 08:58:06 字數 1379 閱讀 6443

題意:

n個人編號分別是1…n在排隊,排隊順序與序號相同。現在有x個喜歡關係和y個厭惡關係

對於每乙個喜歡關係 :a b c 代表編號a和編號c之間的距離需要<=c

對於每乙個厭惡關係:a b c 代表編號a和編號c之間的距離需要》=c

問在能否滿足條件,如果滿足條件求1~n之間的最大距離,如果距離無限大輸出-2

分析:

假設d[i]

d[i]

d[i]

為編號為i

ii的成員距離隊首的距離。

那麼根據題意我們有下列約束條件

因為求最大,我們我們最短路求滿足差分約束下的源點1到n的最小距離即可

#include

#define mset(a,b) memset(a,b,sizeof(a))

using

namespace std;

typedef

long

long ll;

typedef pair<

int,

int> p;

const

int inf=

0x3f3f3f3f

;struct edge

edge

(int to,

int w):to

(to),w

(w)}

;int dis[

1005

],in[

1005];

//距離

vector adja[

1005];

//鄰接表

bool book[

1005];

//標記是否夠在佇列

bool

spfa

(int s,

int n)

//源點為s,共有n個點,求最短路}}

}return

false;}

int t[

1005];

intmain()

for(

int i=

0;i++i)

for(

int i=

2;i<=n;

++i) adja[i]

.push_back

(edge(1

,0))

;for

(int i=

2;i<=n;

++i) adja[i]

.push_back

(edge

(i-1,-

1));

if(!spfa(1

,n))

else

}return0;

}

hdu3592(差分約束)

差分約束 學習鏈結 題意 給一些限制條件,求1到n的最大距離,可轉化成求最短路徑,將不等式化成 的形式 有負邊,要用spfa,不能用dijkstra演算法 如下 include include include include include include include include inclu...

HDU 3592(差分約束)

2015 01 07 00 40 57 思路 差分約束題,用si表示 i 距離第1個人的距離。根據條件 1 約束一 s b s a c 2 約束二 s b s a c 因為要求最長可能距離,所以轉化為求最短路。約束一化為 s b s a c,約束二化為 s a s b c 1 include 2 i...

差分約束 hdu 3666

xij ai l bj 0 xij ai u bj 0 兩邊取對數來去除ai,bj前面的係數 有 logbj logai logxij logu logai log bj logl logxij 化成標準差分約束,建圖,spfa,注意乙個竅門,當入隊總數大於2 n m 時就可以輸出no 因為 乙個點...