HDU 1384 差分約束

2021-07-26 20:12:00 字數 1005 閱讀 5482

要求選取乙個最小的集合,集合中的數滿足n個條件,每個條件:在區間[ai,bi]內至少有ci個數備選在了集合裡。

差分約束,設sum[i]表示在i-1中選取到集合中的數的個數,那麼題目的要求就可以描述為如下的關係:

sum[a] - sum[b+1] <= -c

sum[i] - sum[i+1] <= 0

sum[i+1] - sum[i] <= -1

這樣就可以轉化成關於查分約束的模式了,因為一共有-1到50000一共50002個點,這樣可以求出sum[0] - sum[50001] <= -x,-x的最大值,取個倒數也就是x的最小值,表示在0

到50000的範圍內最少選多少個數。因為邊上包含負數,可能有負環,所以要用spfa來求解。

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

const int maxn = 51111;

const int inf = 0x3f3f3f3f;

const double eps = 1e-6;

struct edge ;

struct spfa

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

m = edges.size();

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

} bool solve(int s) }}

}return true;

}} spfa;

int main()

for (int i = 0; i <= 50000; i++)

spfa.solve(50001);

printf("%d\n", abs(spfa.d[0]));

} return 0;

}

hdu 1384 spfa 差分約束

可能是因為太累了吧,早上6點睡的,spfa居然乙個vis陣列敲錯了!wa了好久。還是要多敲。細心 冷靜 這題是差分約束題,一般的差分約束是先轉換為圖,然後用spfa求其中的最短路 長的一b,沒怎麼看,我自己試著搞了搞,同樣的把這些不等式轉換為圖,然後求的不是最短路而是最長路 而且我的圖里的權值除了回...

hdu 1384 Intervals (差分約束)

problem 1384 好歹用了一天,也算是看懂了差分約束的原理,做出第一條查分約束了。題意是告訴你一些區間中最少有多少元素,最少需要多少個元素才能滿足所有要求。構圖的方法是,a b 1 c。還有就是所有的相鄰的點都要連上 i 1 i 0,i i 1 1。因為我對點離散了,所以就變成 rx i r...

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