張三是某工程公司的專案工程師。一天公司接下一項大型工程,該公司在大型工程的施工前,先要把整個工程劃分為若干個子工程,並把這些子工程編號為1,2
,…,n
1,2,…,n
1,2,…,
n;這樣劃分之後,子工程之間就會有一些依賴關係,即一些子工程必須在某些子工程完成之後才能施工,公司需要工程師張三計算整個工程最少的完成時間。
對於上面問題,可以假設:
1、根據預算,每乙個子工程都有乙個完成時間。
2、子工程之間的依賴關係是:部分子工程必須在一些子工程完成之後才開工。
3、只要滿足子工程間的依賴關係,在任何時刻可以有任何多個子工程同時在施工,也即同時施工的子工程個數不受限制。
例如:有五個子工程的工程規劃表:
1-1−1。第1行為正整數n,表示子工程的個數(n
nn<=200
20020
0)第2行為n個正整數,分別代表子工程1、2
、…、n
1、2、…、n
1、2、…、
n的完成時間。
第3行到n+2行,每行有n-1個0或1,其中的第k+2行的這些0或1,分別表示「子工程k」與子工程1、2
、…、k
−1、k
+1、…
、n1、2、…、k-1、k+1、…、n
1、2、…、
k−1、
k+1、
…、n的依賴關係(k=1
、2、…
、nk=1、2、…、n
k=1、2、
…、n)。每行資料之間均用空格分開。
如果子工程劃分合理則輸出完成整個工程最少要用的時間,如果子工程劃分不合理,則輸出−1-1
−1。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
看題目,我們就想到了拓撲排序,以入度為0
00的子工程起手,用dp來計算最少花費的時間
本題解使用鏈結表
#include
#include
#include
using
namespace std;
long
long n,m,x1,y1,tot;
long
long ans=
0,head[
10005
],f[
10005
],c[
10005
],p[
10005
],du[
10005];
struct node
a[40005];
void
add(
long
long x,
long
long y)
; head[x]
=tot;
}voidtp(
)while
(h}}
intmain()
for(
long
long i=
1;i<=n;
++i)f[i]
=100;tp
();for
(long
long i=
1;i<=n;
++i)
ans+
=f[i];}
printf
("%d"
,ans)
;}
拓撲排序 工程
description 張三是某工程公司的專案工程師。一天公司接下一項大型工程,該公司在大型工程的施工前,先要把整個工程劃分為若干個子工程,並把這些子工程編號為1 2 n 這樣劃分之後,子工程之間就會有一些依賴關係,即一些子工程必須在某些子工程完成之後才能施工,公司需要工程師張三計算整個工程最少的完...
工程安排(拓撲排序)
讀入檔案project.txt 810 1 2 3 4 5 6 7 8 1,2,6,a 1,5,2,b 2,3,3,c 2,4,5,d 2,5,3,e 3,7,2,f 4,7,3,g 5,6,4,h 6,7,2,i 7,8,2,j include include include define max...
python 拓撲排序 Python 拓撲排序
python 拓撲排序 在圖論中,由乙個有向無環圖的頂點組成的序列,當且僅當滿足下列條件時,稱為該圖的乙個拓撲排序 英語 topological sorting 每個頂點出現且只出現一次 若a在序列中排在b的前面,則在圖中不存在從b到a的路徑。print 拓撲排序結果 g.topologicalso...