題目描述:
給你乙個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...