HDU 3592(差分約束)

2022-05-24 15:39:09 字數 1366 閱讀 4622

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 #include 3 #include 4 #include 5 #include 6 #include 7 #include 

8 #include 9 #include 10 #include 11 #include 12

using

namespace

std;

13#define lp (p << 1)

14#define rp (p << 1|1)

15#define getmid(l,r) (l + (r - l) / 2)

16#define mp(a,b) make_pair(a,b)

17 typedef long

long

ll;18 typedef unsigned long

long

ull;

19 typedef pairpii;

20const

int inf = (1

<< 30) - 1;21

const

int maxn = 10010;22

23int

t,n,x,y;

24int

first[maxn],ecnt;

25int

cnt[maxn],inq[maxn],dis[maxn];

2627

struct

edgee[maxn << 1

];30

31void add_edge(int u,int v,int

c)37

38bool spfa(int

s)62}63

}64}65

return

true;66

}6768int

main()

81for(int i = 1; i <= y; ++i)

86for(int i = 1; i <= n; ++i)

90if(spfa(1) == false) printf("

-1\n");

91else

if(dis[n] >= inf) printf("

-2\n");

92else printf("

%d\n

",dis[n]);93}

94return0;

95 }

hdu3592(差分約束)

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

HDU 3592(差分約束)

題意 n個人編號分別是1 n在排隊,排隊順序與序號相同。現在有x個喜歡關係和y個厭惡關係 對於每乙個喜歡關係 a b c 代表編號a和編號c之間的距離需要 c 對於每乙個厭惡關係 a b c 代表編號a和編號c之間的距離需要 c 問在能否滿足條件,如果滿足條件求1 n之間的最大距離,如果距離無限大輸...

差分約束 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 因為 乙個點...