HDU 3666 差分約束 對數

2021-07-26 20:21:39 字數 1059 閱讀 6892

給出乙個矩陣c以及l和u,判斷出是否存在兩個序列a1,a2...an和b1,b2,..bm,使得滿足: a[i] / b[j] * c[i][j] <= u && a[i] / b[j] * c[i][j] >= l

查分約束。

根據題意可以列出如下的關係式:

a[i] / b[j] <= u / c[i][j] 

b[j] / a[i] <= c[i][j] / l

這時候利用對數,將除法轉化成減法,得到:

log(a[i]) - log(b[j]) <= log(u / c[i][j])

log(b[j]) - log(a[i]) <= log(c[i][j] / l)

這樣就是典型的差分約束的形式了,因為這道題,很顯然是個連通圖,所以直接任意選擇乙個節點來進行spfa尋找負圈即可。

但是判斷條件是入隊大於n會超時,網上有人寫的是判斷是否大於sqrt(n)就能過,也不會證明,還有一種方法是手動模擬棧或佇列也能水過。

#include #include #include #include #include #include #include using namespace std;

const int maxn = 444 * 2;

const int inf = 0x3f3f3f3f;

const double eps = 1e-6;

struct edge ;

struct spfa

void addedge(int from, int to, double dist) );

m = edges.size();

g[from].push_back(m - 1);

} bool solve(int s) }}

}return true;

}} spfa;

int c[maxn][maxn];

int main()

} if (spfa.solve(0)) 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...