題解 P1260 工程規劃

2022-07-15 04:48:08 字數 1175 閱讀 8873

建議完成以下題目後在來看此題/題解哦。

p3385 【模板】負環

p5960 【模板】差分約束演算法

核心演算法:差分約束

(這幾乎是一道裸題)

題中寫道:

「不等式形如\(t_i-t_j \leq b\)代表\(i\)和\(j\)的起始時間必須滿足的條件。每個不等式的右邊都是乙個常數\(b\),這些常數可能不相同,但是它們都在區間\(\left(-100,100 \right)\)內。」

即,符合差分約束演算法的定義。

所以我們套用差分約束的模板,可以先求出乙個可行解。

與純模板不同的是,題目中要求:

「對於有解的情況,要使最早進行的那個任務和整個工程的起始時間相同,也就是說,\(t_1,t_2,…,t_n\)中至少有乙個為0。」

我們已知:對於所求出的解,存在以下性質:

設\(x=\left( x_1,x_2,x_3,...,x_n\right)\)是不等式的乙個解。設\(d\)為任意常數,則\(x+d=\left( x_1+d,x_2+d,x_3+d,...,x_n+d\right)\)也是該不等式的乙個解。

所以只要在原模板的基礎上,找到可行解中的最小值,然後讓整體的解減去該值即可。

**如下:

#include #define maxn 100000

#define inf 0x3f3f3f3f

using namespace std;

struct edge

e[maxn];

int cnt=0,adj[maxn],ori=0,vis[maxn],num[maxn],dis[maxn];

int n,m;

void addedge(int u,int v,int w)

queue < int > q;

bool spfa()

q.push(ori); dis[ori]=0; ++num[ori]; vis[ori]=1;

while(!q.empty())

}} }

return 1;

}int main()

if(spfa())

else

printf("no solution");

return 0;

}

P1260 工程規劃

差分約束板子 差分約束 把 i j x 操作等價於從 j 到 i 連一條邊權為 x 的邊。然後跑一遍spfa統計最短路,即為一組合法序列。這道題裡要求以乙個點為基準點 0 在跑完spfa之後統計最小的dis值,然後按順序輸出dis值減去這個最小值即可。另乙個問題是圖不一定連通,有兩個解決方法 1.建...

P1260 工程規劃

題目非常得簡潔明瞭,差分約束的裸題,甚至連不等式都給你寫出來了 沒什麼好分析的,直接看不等式建立方程 這裡把 ti 和 tj 都表示為 i 和 j 因為求的應該是最早的開始時間,我們應該轉化為 然後跑最長路求解 i j leq b j leq b i j geq i b 那麼就應該是從 i 到 j ...

P1260 工程規劃 差分約束

差分約束.差分約束似乎精髓就兩句話 所以對於本題的式子 ti tj leq b 可以寫成 t i b leq t j 然後就從 i 向 j 連一條 b 的邊然後跑最長路即可.按式子可以隨便搞.includeusing namespace std const int maxn 5008 struct ...