動態規劃 關鍵子工程

2021-06-02 07:02:41 字數 2923 閱讀 5888

在大型工程的施工前,我們把整個工程劃分為若干個子工程,並把這些子工程編號為1、

2、……、n;這樣劃分之後,子工程之間就會有一些依賴關係,即一些子工程必須在某些

子工程完成之後才能施工。由於子工程之間有相互依賴關係,因此有兩個任務需要我們去完

成:首先,我們需要計算整個工程最少的完成時間;同時,由於一些不可**的客觀因素會

使某些子工程延期,因此我們必須知道哪些子工程的延期會影響整個工程的延期,我們把有

這種特徵的子工程稱為關鍵子工程,因此第二個任務就是找出所有的關鍵子工程,以便集中

精力管理好這些子工程,盡量避免這些子工程延期,達到用最快的速度完成整個工程。為了

便於程式設計,現在我們假設:

(1)根據預算,每乙個子工程都有乙個完成時間。

(2)子工程之間的依賴關係是:部分子工程必須在一些子工程完成之後才開工。

(3)只要滿足子工程間的依賴關係,在任何時刻可以有任何多個子工程同時在施工,

也既同時施工的子工程個數不受限制。

(4)整個工程的完成是指:所有子工程的完成。

例如,有五個子工程的工程規劃表:

序號 完成時間 子工程1 子工程2 子工程3 子工程4 子工程5

子工程1 5 - 0 0 0 0

子工程2 4 0 - 0 0 0

子工程3 12 0 0 - 0 0

子工程4 7 1 1 0 - 0

子工程5 2 1 1 1 1 -

其中,**中第 i+1 行 j+2 列的值如為 0 表示「子工程 i」可以在「子工程 j」沒完成

前施工,為 1 表示「子工程 i」必須在「子工程 j」完成後才能施工。上述工程最快完成時

間為 14 天,其中子工程1、3、4、5為關鍵子工程。

又例如,有五個子工程的工程規劃表:

序號 完成時間 子工程1 子工程2 子工程3 子工程4 子工程5

子工程1 5 - 0 1 0 0

子工程2 4 0 - 0 0 0

子工程3 12 0 0 - 1 0

子工程4 7 1 1 0 - 0

子工程5 2 1 1 1 1 -

上述的子工程劃分不合理,因為無法安排子工程1,3,4的施工。

輸入資料:

第 1 行為n,n是子工程的總個數,n≤200。

第2 行為n個正整數,分別代表子工程1、2、……、n的完成時間。

第 3 行到 n+2 行,每行有 n-1 個 0 或 1。其中的第 i+2 行的這些 0,1,分別表示「子

工程 i」與子工程1、2、…、i-1、i+1、…n的依賴關係,(i=1、2、……、n)。每行資料之

間均用乙個空格分開。

輸出資料:

如子工程劃分不合理,則輸出-1;

如子工程劃分合理,則用兩行輸出:第1行為整個工程最少的完成時間。第2行為按由

小到大順序輸出所有關鍵子工程的編號。

樣例:

輸入檔名:project.in

5

5 4 12 7 2

0 0 0 0

0 0 0 0

0 0 0 0

1 1 0 0

1 1 1 1

輸出檔名:project.out

14 1 3 4 5

可用記憶化搜尋或者拓撲排序解決。

狀態:用f[i]表示完成i所需的最小時間及等待時間。

轉移方程:f[i] = max(f[j]) + t[i],其中,j是i的前驅結點。

accode:

#include #include #include #include using std::bitset;

using std::max;

const char fi = "project.in";

const char fo = "project.out";

const int maxn = 210;

struct edge;

edge *edge[maxn];

int f[maxn];

int t[maxn];

int ou[maxn];

bitset key;

bitset marked;

int n, ok;

void init_file()

void insert(int u, int v)

void readdata()

}for (int i = 1; i < n + 1; ++i)

if (ou[i] == 0) insert(0, i);

} void dp(int u)

//判斷是否存在環。

dp(v);

f[u] = max(f[u], f[v]);

}f[u] += t[u];

marked.reset(u); //要記得清空標記。

} void find(int u)

}void work()

int main()

關鍵子工程

在大型工程的施工前,我們把整個工程劃分為若干個子工程,並把這些子工程編號為 1 2 n 這樣劃分之後,子工程之間就會有一些依賴關係,即一些子工程必須在某些子工程完成之後才能施工。由於子工程之間有相互依賴關係,因此有兩個任務需要我們去完成 首先,我們需要計算整個工程最少的完成時間 同時,由於一些不可 ...

spring mvc中輸入關鍵子查詢的步驟

在spring mvc hibernate mysql中,講解下如何做比如在文字框裡輸入中文,然後查詢的一些套路。1 mysql中,首先要做到的是my.ini的客戶編碼為utf8,而資料庫中的表,表裡的字段也用utf 8來整理 2 在serachcontroller中,如下結構 獲得關鍵字 stri...

js中的關鍵子in的使用方法

in.從字面上理解就是什麼在什麼中,在js中差不多也是表達這個意思,主要作用是判斷陣列元素或者物件屬性,也用來遍歷陣列和物件 使用方法 1.判斷 x in arr 這裡要注意的是判斷陣列的話 x表示的是下標,這個意識就是arr陣列中有下標為x的元素嗎 x in obj 現在的x表示的是物件的屬性,這...