兩遍topo排序

2022-10-08 18:12:18 字數 2523 閱讀 4931

目錄兩遍topo排序

**時間複雜度

參考文章

題目傳送門

time limit: 1000 ms

memory limit: 256 mb

小h為了完成一篇**,一共要完成n個實驗。其中第i個實驗需要ai的時間去完成。

小h可以同時進行若干實驗,但存在一些實驗,只有當它的若干前置實驗完成時,才能開始進行該實驗。

同時我們認為小h在乙個實驗的前置實驗都完成時,就能馬上開始該實驗。

為了讓小h盡快完成**,需要知道在最優的情況下,最後乙個完成的實驗什麼時候完成?

小h還想知道,在保證最後乙個實驗盡快完成的情況下(即保證上一問的答案不變),他想知道每個實驗最晚可以什麼時候開始。

設第i個實驗最早可能的開始時間為fi,不影響最後乙個實驗完成時間的最晚開始時間為gi,請你回答

除以10^9+7所得的餘數。

題目保證有解。

從標準輸入讀入資料。

第一行輸入乙個整數n,m。

第二行輸入n個正整數,a1,a2,.....an,描述每個實驗完成所需要的時間。

接下來讀入m行,每行讀入兩個整數u,v,表示編號為u的實驗是編號為v的實驗的前置實驗。

對於所有的輸入資料,都滿足1<=n<=10^5,1<=m<=5*10^5,1<=ai<=10^6。

輸出到標準輸出。

第一行輸出乙個整數表示最晚完成的實驗的時間。

第二行輸出乙個整數表示除以10^9+7所得的餘數。

複製

7 5

11 20 17 10 11 17 17

5 46 1

7 32 4

2 1

複製

3 4

7840

第乙個點最早開始時間為20,最晚開始時間為23。

第二個點最早開始時間為0,最晚開始時間為3。

第三個點最早開始時間為17,最晚開始時間為17。

第四個點最早開始時間為20,最晚開始時間為24。

第五個點最早開始時間為0,最晚開始時間為13。

第六個點最早開始時間為0,最晚開始時間為6。

第七個點最早開始時間為0,最晚開始時間為0。

清華大學2023年機試題
把給的例子畫圖畫出來,然後分析

step1

每個實驗u的最早開始時間

step2

然後求最後乙個實驗的最優完成時間

step3

我們反過來思考,現在知道了每個實驗花費的時間,和所有實驗的最晚完成時間,我們只需要求出每個實驗最晚的完成時間,然後減去該實驗所花費的時間,就是該實驗的最晚開始時間

注意:

#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int n = 100010, m = 2*n;

const int mod = 1e9 + 7;

int n, m;

int d[n];// 存每個節點的入度

int res[n], cnt = 0;

//存圖

int h[n], e[m], ne[m], idx = 0;

int timex[n];

int a[n], b[n];

int ans;

int f[n], g[n];

void add(int a, int b)

void topo()

while(q.size())

} }

// 得到最晚完成時間

for(int i = 1; i <= n; i++) ans = max(ans, f[i] + timex[i]);

}void topo2()

while(q.size())

} }}

void init()

int main()

topo(); // 得到ans,f[..]

// 重新反向建圖

init();

for(int i = 0; i < m; i++)

topo2(); // 得到 g[..]

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

// printf("%d %d\n", f[i], g[i]);

//ll total = 1;

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

total = (total % mod) * ((ll)g[i] - f[i] + 1 % mod) % mod;

printf("%d\n%lld\n", ans, total);

return 0;

}

easyui dialog載入兩遍

以下兩種寫法都會載入並開啟這個dialog,所以如果都寫的話,會載入兩遍,其中有href 屬性時,會傳送兩遍http請求 載入並開啟,如果之前已經載入過屬性 如href等 會再載入一次 比如傳送url請求 dialogdiv dialog open 載入dialog,此時初始化時也會請求href的u...

C結果輸出兩遍

scanf輸入後 換行符還是留在緩衝區中,特別地 scanf c a 會讀取換行符 所以我們在scanf後面應該加上getchar 但是一般情況下scanf只讀取對應的型別 所以不用管 另外 gets 好像也會自動讀取換行符 為避免此類問題 輸入不用單個字元輸入 scanf d c s f a,b,...

好程式需要至少寫兩遍

great code is written twice or more 這篇文章翻譯而來。最近這些年,越來越多的人開始轉向敏捷開發。各種敏捷開發技術並不新鮮,大多是在80和90年代發展形成。但只是在最近這些年,程式設計師和 更重要的是 一些商業顧問,架構師,客戶開始變得喜歡和擁抱敏捷開發。進化中的需...