建議完成以下題目後在來看此題/題解哦。
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 ...