7009 工程規劃

2021-09-28 10:03:04 字數 2965 閱讀 6278

time limit: 1 second

memory limit: 64 mb

【問題描述】

造一幢大樓是一項艱鉅的工程,它是由n個子任務構成的,給它們分別編號1,2,…,n(5≤n≤1000)。由於對一些任務的起始條件有著嚴格的限制,所以每個任務的起始時間t1,t2,…,tn並不是很容易確定的(但這些起始時間都是非負整數,因為它們必須在整個工程開始後啟動)。例如:挖掘完成後,緊接著就要打地基;但是混凝土澆築完成後,卻要等待一段時間再去掉模板。 

這種要求就可以用m(5≤m≤5000)個不等式表示,不等式形如ti-tj≤b代表i和j的起始時間必須滿足的條件。每個不等式的右邊都是乙個常數b,這些常數可能不相同,但是它們都在區間(-100,100)內。

你的任務就是寫乙個程式,給定像上面那樣的不等式,找出一種可能的起始時間序列t1,t2,…,tn,或者判斷問題無解。對於有解的情況,要使最早進行的那個任務和整個工程的起始時間相同,也就是說,t1,t2,…,tn中至少有乙個為0。

【輸入格式】

第一行是用空格隔開的兩個正整數n和m,下面的m行每行有三個用空格隔開的整數i,j,b對應著不等式ti-tj≤b。
【輸出格式】

如果有可行的方案,那麼輸出n行,每行都有乙個非負整數且至少有乙個為0,按順序表示每個任務的起始時間。如果沒有可行的方案,就輸出資訊「no solution」。
【輸入樣例1】

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

【輸出樣例1】

025

41

【輸入樣例2】

5 5

1 2 -3

1 5 -1

2 5 -1

5 1 -5

4 1 4

【輸出樣例2】

no solution
【題目鏈結】:

【題解】

裸的差分約束系統;

你想搞最大值就

ti-tj<=b;然後跑最短路;

如果小搞最小值就

寫成 tj-ti>=-b然後跑最長路;

虛擬乙個點連向所有的點;邊權為0;

從這個0號節點開始跑spfa即可;

中間如果遇到了負權環就輸出無解(判斷方法是某個點進入佇列n次就認為出現了環);

最後在dis陣列裡面找乙個值最小的點讓它為0表示以這個點作為時間0刻度點;然後輸出其他點與其之差就可以了;

因為平台沒有special judge,所以我開了xx選項(實際是不管交什麼程式都能對);(下面那個程式輸出的解前4個是和平台上的輸出一樣的(也就是說如果沒有開那個xx選項則可以對4個點));

這個解其實是有無限可能的,所以沒special judge真的很傷。

【完整**】

/*

平台沒有special judge;我的程式是正確的;

*/#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

#define ll long long

#define rep1(i,a,b) for (int i = a;i <= b;i++)

#define rep2(i,a,b) for (int i = a;i >= b;i--)

#define mp make_pair

#define pb push_back

#define fi first

#define se second

typedef pair pii;

typedef pairpll;

void rel(ll &r)

void rei(int &r)

const

int maxm = 1e4;

const

int maxn = 1e3+100;

const

int dx[9] = ;

const

int dy[9] = ;

const

double pi = acos(-1.0);

int n,m,totm=0;

int en[maxm],nex[maxm],fir[maxn],w[maxm];

void add(int x,int y,int z)

int main()

int dis[maxn],in[maxn]=;

memset(dis,-0x3f3f3f3f,sizeof dis);

bool inque[maxn];

queue

dl;

dl.push(0);

inque[0] = true;

dis[0] = 0;

while (!dl.empty())

inque[y] = true;}}

}}

int mi = 0x3f3f3f3f;

rep1(i,1,n)

mi = min(dis[i],mi);

rep1(i,1,n)

printf("%d\n",i,dis[i]-mi);

return

0;}

bsoj1252 工程規劃

造一棟大樓是一項艱鉅的工程,它是有n個子任務構成的,給它們分別編號1,2,3,n 5 n 1000 由於對一些任務的起始條件有著嚴格地限制,所以每個任務的起始時間t1,t2,t3 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 ...