hdu 3666差分約束

2022-09-08 16:36:19 字數 2362 閱讀 5221

題目描述:

給你乙個n*m的矩陣,給你兩個數l和u(l <= u)問你是否存在這樣的n+m個數字(計作a1….an, b1…..bm),使矩陣中任意元素xij,滿足:

l <= (xij * ai) / bj <= u

輸出yes or no。

解題報告:

轉換成:xij * ai – u * bj <= 0 和 l*bj – xij * ai <= 0

差分約束中的xi – xj <= val, 中的xi和xj都不能夠有係數。

那麼有了係數,只需去log把乘法轉化成加法就好了:

log(xij) + logai – logu – logbj <= 0 è logai – logbj <= logbj – logxij

另乙個式子也同理,這樣就轉化成了標準的差分約束。

注意:判斷有無解(負環)的時候,如果用spfa,不能用入隊次數大於n來判斷,會超時。

有如下兩種比較可靠的方法(一般情況下)

1:某個點入隊次數大於sqrt(n)的時候

2:所有入隊次數大於t * (n + m),其中t一般取2

分析:題目意思就是是否存在ai,bj,使得l<=cij*(ai/bj)<=u (1<=i<=n,1<=j<=m)成立

首先,把cij除到兩邊:l'<=ai/bj<=u',如果差分約束的話,應該是ai-bj的形式,於是可以取對數

log(l')<=log(ai)-log(bj)<=log(u')

把log(ai)和log(bj)看成兩個點ai和bj,化成求最短路的形式:dis[ai]-dis[bj]<=log(u'),dis[bj]-dis[ai]<=-log(l')

轉化為差分約束後,spfa拿下

view code

//

i'm lanjiangzhou//c

#include #include

#include

#include

#include

#include

//c++

#include #include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

//*************************output*************************

#ifdef win32

#define int64 "%i64d"

#define uint64 "%i64u"

#else

#define int64 "%lld"

#define uint64 "%llu"

#endif

//**************************constant***********************

#define inf 0x3f3f3f3f

//aply for the memory of the stack

//#pragma comment (linker, "/stack:1024000000,1024000000")

//end

const

int maxn =1010

;int

head[maxn];

intvis[maxn];

int _count[maxn];//

用來記錄同乙個點入佇列的次數

intn,m,cnt;

struct

pointedge[maxn*maxn];

double

dis[maxn];

void createmap(int u,int v,double

w)int

spfa()

dis[

1]=0

; vis[

1]=1

; _count[

1]++;

queue

q;q.push(1);

while(!q.empty())}}

}return1;

}int

main()

}int flag=spfa();

if(flag) printf("

yes\n");

else printf("

no\n");

}return0;

}

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

HDU3666 差分約束

思路 根據題意可得,l a i g i j b j u,看到不等式,馬上想到差分約束 將上式移項得l g i j a i b j u g i j 再取對數log l g i j log a i log b j log u g i j 最後構造 的不等式,用spfa跑最短路,若存在負環,說明無解,輸出...

HDU 3666(差分約束)

2015 01 08 22 48 00 思路 巧妙的建圖.由 l cij ai bj u,要轉化成加減的話全體套上log.化為 log l log cij log ai log bj log u 1 log ai log bj log u log cij 2 log bj log ai log ci...