POJ 1949 最小優先佇列

2022-08-23 18:09:11 字數 1658 閱讀 5246

題意是有n行任務,給出完成每項任務所需要的時間長度,求出完成所有任務所需要的最短時間.每個任務都會有乙個約束條件,就是在完成這項任務之前必須完成所列出的其它任務.可以同時做多項任務.簡單來說就像煮飯炒菜問題一樣,可以一邊燒飯一邊炒菜.但炒菜之前必先洗菜.

這道題我主要用了最小優先佇列,有點像dijktra, 列隊按兩個條件來維護, 首先是所按所需的條件(前任務)個數,這裡用need陣列儲存,然後按開始任務的時間. 用乙個need陣列維護每個任務所需的前任務個數,如果為0, 則丟進列隊裡, 每次取出列隊首元素, 即當前可以開始的任務, 將所有以這一任務為前提的任務的need減一,再更新一下start值(表示任務開始的時間). 若need為0,則丟進列隊裡,如此重複直到列隊為空, 再找出start裡最大值,再加上這個最大start值的任務的所需時間,即為完成所有任務所需的最短時間.

**

1

#include

<

iostream

>

2#include

<

cstdio

>

3#include

<

string

>

4#include

<

cstring

>

5#include

<

vector

>

6#include

<

queue

>

7#include

<

algorithm

>89

using

namespace

std;

1011

const

intmaxn

=10001;12

const

intinf

=0x7f7f7f7f;13

14vector

<

int>

box[maxn];

15int

cost[maxn], start[maxn], need[maxn];

1617

void

init_input(

const

intn)

1832}33

}34void

clear(

const

intn)

3539

40class

comp

4150

};51

52int

solve(

const

intn)

5362}63

intans=0

;64while( !

que.empty() )

6578

if( need[

*ix] ==0

)79que.push(

*ix);

80++

ix;81}82

}83for(

inti=0

; i<

n; ++

i )84

87return

ans;88}

8990

intmain()

91102

return0;

103}

104

POJ1949 拓樸排序

拓樸排序 1 將入度為0的點入棧 2 while stack.empty node stack.top for each currentnode與node有邊 indegree currentnode 入度減一 poj1949在這裡儲存currentnode完成的時間,當然是貪心記錄最遲完成的時間 ...

最小堆,優先佇列

定義乙個list h crud 查詢 堆頂 最小 h 0 0 替換 heapq.heapreplace heap,key,value 參考鏈結 你打算每天 最多 吃乙個蘋果來保證營養均衡。注意,你可以在這 n 天之後繼續吃蘋果。示例 1 思路 模擬即可,堆中用key,value 儲存,保質期和蘋果個...

poj 2970 優先佇列

先按di排序,從小到大 然後依次完成合同,若發現第i個合同無法在截止日期前完成,便從之前已經完成的任務中選乙個aj最大的合同,付錢來使得這個合同盡快完成。include include include include include using namespace std struct node i...