思路:
根據題意可得,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跑最短路,若存在負環,說明無解,輸出no,反之輸出yes
注:有個坑點,這題對時間複雜度要求較高,所以spfa只能算到sqrt(n+m),否則就會被t飛
/*
hdu--3666
*/#includeusing namespace std;
const int n = 805;
const int inf = 0x3f3f3f3f;
int n, m, l, u;
int head[n], tot;
double dis[n];
bool vis[n];
int cnt[n];
struct edge e[n*n];
void add(int u, int v, double w)
bool spfa(int s)
vis[s] = true;
cnt[s] = 0;
dis[s] = 0;
queueq;
q.push(s);
while (!q.empty())
}} }
return true;
}int main()
} printf(spfa(1) ? "yes\n" : "no\n");
} 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 因為 乙個點...
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...
hdu 3666差分約束
題目描述 給你乙個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...