題意:乙個n*m的矩陣,兩個陣列a,b。矩陣中的每個元素l<=(xij*ai)/bj<=u,問是否存在這樣的兩個陣列。
這是乙個差分約束的問題,將不等式變為xij*ai-u*bj<=0 and l*bj-xij*ai<=0,但是由於是乘法形式,不符合差分約束xi-xj<=b的形式,故不等式兩面同時取對數,即變為log(ai)-log(bj)<=log(u/xij) and log(bj)-log(ai)<=log(xij/l), 然後按照差分約束的模板做就可以了。注意的是l,u是浮點型的,因為這個錯誤我找了好長時間。。。
#include #include #include #include using namespace std;
const int oo=1e8;
const int mn=161000;
const int mm=961000;
int edge,n,m;
double l,u;
int ver[mm],next[mm];
double dis[mn],cost[mm];
int head[mn],vis[mn],q[mn],outque[mn];
void addedge(int u,int v,double c)
bool spfa()
return true;
}int main()
if(spfa()) puts("yes");
else puts("no");
}return 0;
}
差分約束 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...