bsoj1252 工程規劃

2021-07-25 07:06:21 字數 1804 閱讀 1302

造一棟大樓是一項艱鉅的工程,它是有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 ...