造一棟大樓是一項艱鉅的工程,它是有n個子任務構成的,給它們分別編號1,2,3,….,n(5<=n<=1000).由於對一些任務的起始條件有著嚴格地限制,所以每個任務的起始時間t1,t2,t3….,tn並不是很容易確定的(但這些起始時間都是非負整數,因為它們必須在整個工程開始後啟動).例如:挖掘完成後,緊接著就要打地基;但是混泥土澆築完成後,卻要等待一段時間再去掉模板.
這種要求就可以用m(5<=m<=5000)個不等式表示,不等式形如ti-tj<=b代表i和j的起始時間必須滿足的條件.每個不等式的右邊都是乙個常數b,這些常數可能不相同,但是它們都在區間(-100,100)內.
你的任務就是寫乙個程式,當給定像上面那樣的不等式後,找出一種可能的起始時間序列t1,t2,t3….,tn,或者判斷問題無解.對於有解的情況,要使最早進行的哪個任務和整個工程的起始時間,也就是說,t1,t2,t3….,tn中至少有乙個0.
第一行是用空格分開的兩個正整數n和m,下面的m行每行有三個用空格分開的整數i,j,b對應著不等式ti-tj<=b.
如果有可行的方案,那麼輸出n行,每行都有乙個非負整數且至少有乙個0,按照順序表示每個任務的起始時間.如果沒有可行的方案,就輸出資訊」no solution」.
5 8
1 2 0
1 5 -1
2 5 1
3 1 5
4 1 4
4 3 -1
5 3 -3
5 4 -3
0 2
5 4 1
bsoj無special judge,md坑爹,必須手動建虛點0連線所有點,否則wrong answer
裸差分約束,寫了個不太完美的模板
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
inline
const
int get_int()
while(x>='0'&&x<='9')
return num*bj;
}const
int maxn=20005;
struct edge e[50005];
struct difference_constraints
void addedge(int from,int to,int dist) );
m=edges.size();
g[from].push_back(m-1);
}void insert(int x,int y,int v,bool flag)
bool spfa(int s) }}
}return
true;
}bool main(int start,bool flag)
for(int i=1; i<=n; i++)min=min(min,dist[i]); //轉為正數
for(int i=1; i<=n; i++)ans[i]=dist[i]-min;
return
true;
}void output()
};difference_constraints dc; //全程小於符
int n,m;
int main()
if(dc.main(start,0)==0)
dc.output();
return
0;}
7009 工程規劃
time limit 1 second memory limit 64 mb 問題描述 造一幢大樓是一項艱鉅的工程,它是由n個子任務構成的,給它們分別編號1,2,n 5 n 1000 由於對一些任務的起始條件有著嚴格的限制,所以每個任務的起始時間t1,t2,tn並不是很容易確定的 但這些起始時間都是...
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 ...