UVa00452 Project Scheduling

Last updated on a year ago

題目連結


  • ❗️ 題意
    給定點、經過這個點的cost、哪些點連到這個點,求出需要多少時間才能夠走完所有點。

  • ✔️ 題解
    ans[now]代表目前這個點的答案,而ans[next]是now這個點所可以走到的點,而更新公式就是ans[next] = max(ans[next], node[next] + ans[now]),其中node是原本點上的值。
    我們只需要在利用BFS做拓墣排序的過程中更新ans的值,就能夠確定點的更新順序是對的,不會有更新點的時候前面的點還沒有更新到的問題,最後只需要輸出最大的ans[i]即可。

  • 💻 程式碼

    140ms

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    #include <bits/stdc++.h>
    using namespace std;

    const int MAXN = 30;
    int node[MAXN];
    int cnt[MAXN];
    int ans[MAXN];
    bool used[MAXN];
    vector<int>G[MAXN];

    void init(){
    memset(node, 0, sizeof(node));
    memset(cnt, 0, sizeof(cnt));
    memset(ans, 0, sizeof(ans));
    memset(used, 0, sizeof(used));
    for(int i = 0; i < MAXN; i++){
    G[i].clear();
    }
    }

    int main(){
    int t;
    string line;
    cin >> t;
    cin.ignore();
    getline(cin, line);
    while(t--){
    init();
    while(true){
    line.clear();
    getline(cin, line);
    if(line.size() == 0){
    break;
    }
    stringstream ss(line);
    char idx, another;
    int val;
    ss >> idx;
    ss >> val;
    node[idx - 'A'] = val;
    ans[idx - 'A'] = val;
    used[idx - 'A'] = 1;
    while(ss >> another){
    cnt[idx - 'A']++;
    G[another - 'A'].emplace_back(idx - 'A');
    }
    }
    queue<int>q;
    for(int i = 0; i < MAXN; i++){
    if(cnt[i] == 0 && used[i]){
    q.emplace(i);
    }
    }
    while(!q.empty()){
    int now = q.front(); q.pop();
    for(auto next: G[now]){
    ans[next] = max(ans[next], node[next] + ans[now]);
    cnt[next]--;
    if(cnt[next] == 0){
    q.emplace(next);
    }
    }
    }
    int res = 0;
    for(int i = 0; i < MAXN; i++){
    res = max(res, ans[i]);
    }
    cout << res << '\n';
    if(t){
    cout << '\n';
    }
    }
    }

    這題更煩的反而是格式輸入輸出吧…😅


  • 🧠 心得
    當初會解這題是因為剛好有學長來問我類似的題目,也趁這次機會來複習一下拓墣排序。之前的我都是用DFS的順序來找order,而改用queue的方法只需要用一個array來記錄入in degree即可,比我用DFS的做法好寫很多。
    順帶一提,學長說這是他們進碩班老師拿給他們練習的大一題目,大一就在拓墣排序,沒搞錯吧?


UVa00452 Project Scheduling
http://example.com/2022/08/13/20220813/
Author
Hank Hsu
Posted on
August 13, 2022
Licensed under