08-圖9 關鍵活動 (30 分)

假定一個工程項目由一組子任務構成,子任務之間有的可以并行執行,有的必須在完成了其它一些子任務后才能執行。“任務調度”包括一組子任務、以及每個子任務可以執行所依賴的子任務集。

比如完成一個專業的所有課程學習和畢業設計可以看成一個本科生要完成的一項工程,各門課程可以看成是子任務。有些課程可以同時開設,比如英語和C程序設計,它們沒有必須先修哪門的約束;有些課程則不可以同時開設,因為它們有先后的依賴關系,比如C程序設計和數據結構兩門課,必須先學習前者。

但是需要注意的是,對一組子任務,并不是任意的任務調度都是一個可行的方案。比如方案中存在“子任務A依賴于子任務B,子任務B依賴于子任務C,子任務C又依賴于子任務A”,那么這三個任務哪個都不能先執行,這就是一個不可行的方案。

任務調度問題中,如果還給出了完成每個子任務需要的時間,則我們可以算出完成整個工程需要的最短時間。在這些子任務中,有些任務即使推遲幾天完成,也不會影響全局的工期;但是有些任務必須準時完成,否則整個項目的工期就要因此延誤,這種任務就叫“關鍵活動”。

請編寫程序判定一個給定的工程項目的任務調度是否可行;如果該調度方案可行,則計算完成整個工程項目需要的最短時間,并輸出所有的關鍵活動。

輸入格式:

輸入第1行給出兩個正整數N(≤)和M,其中N是任務交接點(即銜接相互依賴的兩個子任務的節點,例如:若任務2要在任務1完成后才開始,則兩任務之間必有一個交接點)的數量。交接點按1~N編號,M是子任務的數量,依次編號為1~M。隨后M行,每行給出了3個正整數,分別是該任務開始和完成涉及的交接點編號以及該任務所需的時間,整數間用空格分隔。

輸出格式:

如果任務調度不可行,則輸出0;否則第1行輸出完成整個工程項目需要的時間,第2行開始輸出所有關鍵活動,每個關鍵活動占一行,按格式“V->W”輸出,其中V和W為該任務開始和完成涉及的交接點編號。關鍵活動輸出的順序規則是:任務開始的交接點編號小者優先,起點編號相同時,與輸入時任務的順序相反。

輸入樣例:

7 8
1 2 4
1 3 3
2 4 5
3 4 3
4 5 1
4 6 6
5 7 5
6 7 2

輸出樣例:

17
1->2
2->4
4->6
6->7
#include<cstdio>
#include<cstring>
const int maxn = 110;
const int INF = 100000000;int map[maxn][maxn];
int indegree[maxn],outdegree[maxn];
int earliest[maxn],latest[maxn];void init(int n){for(int i = 1; i <= n; i++){for(int j = 1; j <= n; j++){map[i][j] = -1;}indegree[i] = 0;outdegree[i] = 0;earliest[i] = 0;latest[i] = INF;}
}int max(int a,int b){return a > b ? a : b;
}int min(int a,int b){return a < b ? a : b;
}int early_time(int n){int queue[n];int front = -1, rear = -1;for(int i = 1; i <= n; i++){if(indegree[i] == 0){queue[++rear] = i;}}int cnt = 0;while(front < rear){int v = queue[++front];cnt++;for(int i = 1; i <= n; i++){if(map[v][i] >= 0){indegree[i]--;earliest[i] = max(earliest[i],earliest[v]+map[v][i]);if(indegree[i] == 0){queue[++rear] = i;}}}}int ans = 0;if(cnt != n) ans = -1;else{ans = earliest[0];for(int i = 1; i <= n; i++){if(ans < earliest[i]) ans = earliest[i];}}return ans;
}void late_time(int n,int x){int queue[n];int front = -1,rear = -1;for(int i = n; i >= 1; i--){if(outdegree[i] == 0){queue[++rear] = i;latest[i] = x;}}while(front < rear){int v = queue[++front];for(int i = n; i >= 1; i--){if(map[i][v] >= 0){outdegree[i]--;latest[i] = min(latest[i],latest[v]-map[i][v]);if(outdegree[i] == 0){queue[++rear] = i;}}}}
}int main(){int n,m;scanf("%d%d",&n,&m);init(n);int v,u,w;for(int i = 0; i < m; i++){scanf("%d%d%d",&u,&v,&w);map[u][v] = w;indegree[v]++;outdegree[u]++;}int flag = early_time(n);if(flag == -1) printf("0\n");else{printf("%d\n",flag);late_time(n,flag);for(int i = 1; i <= n; i++){if(earliest[i] != latest[i]) continue;for(int j = n; j >= 1; j--){if(map[i][j] >= 0 && earliest[j] == latest[j] && (latest[j] - earliest[i] == map[i][j]))printf("%d->%d\n",i,j); }}}return 0;
}

?

轉載于:https://www.cnblogs.com/wanghao-boke/p/10901852.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385067.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385067.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385067.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++ Primer

C Primer目錄索引 虛函數表剖析&#xff08;一&#xff09;虛函數表剖析&#xff08;二&#xff09;static關鍵字用法 volatile、const的用法???????

10-排序4 統計工齡 (20 分)

給定公司N名員工的工齡&#xff0c;要求按工齡增序輸出每個工齡段有多少員工。 輸入格式: 輸入首先給出正整數N&#xff08;≤&#xff09;&#xff0c;即員工總人數&#xff1b;隨后給出N個整數&#xff0c;即每個員工的工齡&#xff0c;范圍在[0, 50]。 輸出格式: 按工齡的遞…

10-排序6 Sort with Swap(0, i) (25 分)

Given any permutation of the numbers {0, 1, 2,..., N?1}, it is easy to sort them in increasing order. But what if Swap(0, *) is the ONLY operation that is allowed to use? For example, to sort {4, 0, 2, 1, 3} we may apply the swap operations in the follow…

Java讀取Excel文件

首先下載jxl.jar包&#xff0c;下載地址&#xff1a;http://download.csdn.net/detail/prstaxy/4469935然后在工程文件上右鍵選Built Path—Configure Built Path切換到Libraries導入jxl.jar包。讀取Excel方法示例&#xff1a;寫入Excel見文章&#xff1a;http://blog.csdn.net…

11-散列1 電話聊天狂人 (25 分)

給定大量手機用戶通話記錄&#xff0c;找出其中通話次數最多的聊天狂人。 輸入格式: 輸入首先給出正整數N&#xff08;≤&#xff09;&#xff0c;為通話記錄條數。隨后N行&#xff0c;每行給出一條通話記錄。簡單起見&#xff0c;這里只列出撥出方和接收方的11位數字構成的手機…

Java寫入Excel文件

首先下載jxl.jar包&#xff0c;下載地址&#xff1a;http://download.csdn.net/detail/prstaxy/4469935然后在工程文件上右鍵選Built Path—Configure Built Path切換到Libraries導入jxl.jar包。寫入Excel方法示例&#xff1a;讀取Excel見文章&#xff1a;http://blog.csdn.net…

Glib介紹

GLib是一種底層庫&#xff0c;創建GDK和GTK應用程序時該庫提供許多有用的定義和函數。包括基本類型及限制的定義、標準宏、類型轉化、字節序、存儲分配、警告和斷言、消息記錄、計時器、字符串工具、hook函數、句法掃描器、動態加載模塊和字符串自動補全&#xff0c;同時也提供…

11-散列3 QQ帳戶的申請與登陸 (25 分)

實現QQ新帳戶申請和老帳戶登陸的簡化版功能。最大挑戰是&#xff1a;據說現在的QQ號碼已經有10位數了。 輸入格式: 輸入首先給出一個正整數N&#xff08;≤&#xff09;&#xff0c;隨后給出N行指令。每行指令的格式為&#xff1a;“命令符&#xff08;空格&#xff09;QQ號碼&…

glib字符串

學過面向對象語言的同學一定都知道String類&#xff0c;一定知道這個類對字符串的操作是多麼的方便&#xff0c;但是c語言中是沒有這個類&#xff0c;甚至沒有類的概念&#xff0c;但是glib幫我們做的這個“類” GString 除了使用gchar *進行字符串處理以外&#xff0c;Glib還…

KMP 串的模式匹配 (25 分)

給定兩個由英文字母組成的字符串 String 和 Pattern&#xff0c;要求找到 Pattern 在 String 中第一次出現的位置&#xff0c;并將此位置后的 String 的子串輸出。如果找不到&#xff0c;則輸出“Not Found”。 本題旨在測試各種不同的匹配算法在各種數據情況下的表現。各組測試…

命令行工具tshark使用小記

1、目的 寫這篇博客的目的主要是為了方便查閱&#xff0c;使用wireshark可以分析數據包&#xff0c;可以通過編輯過濾表達式來達到對數據的分析&#xff1b;但我的需求是&#xff0c;怎么樣把Data部分導出來&#xff0c;因為后續的工作主要針對數據包的Data部分&#xff0c;主要…

winshark重要數據結構

說起來有一些慚愧&#xff0c;研究wireshark有一段時間了&#xff0c;但是對源代碼的分析卻至今沒有什么進展。。。 最初想要研究wireshark是因為我的開題是基于wireshark來做的。 現在有很多抓包工具&#xff0c;wireshark的優勢在于完全開源&#xff0c;分析功能強大&#xf…

C語言寫數據庫(二)

簡單的實現增刪查改的操作后&#xff0c;實現了一個先讀寫其中一個表的某兩項內容&#xff0c;再把相關字符段寫入到另外一張表中去。涉及到查詢和插入兩個步驟。 其中還涉及到漢字的讀寫和插入&#xff0c;會有字符的操作產生亂碼。所以要先保證mysql的漢字字符編碼&#xff0…

wireshark源代碼分析

各位親&#xff0c;不是我不想回復你們的問題。是我也不了解。不能誤導。希望大家相互幫助。看看能否幫那些提問的小盆友們回復一下呢&#xff1f; 這些都是轉載的&#xff0c;如果實在沒有辦法&#xff0c;可以打開鏈接到原作者哪里去提問試試看。。。 經過多次嘗試&#xf…

C語言寫數據庫(三)

遇到的問題以及解決思路方法 1.外部導入數據庫文件 進入mysql&#xff0c;創建數據庫sh_robot source /home/exbot/sh_robot.sql 查看數據庫編碼格式 show variables like “%char%”; 2.數據庫插入操作 進入相關數據庫&#xff1a;use 數據庫名&#xff1b; 查詢存在該表是否存…

Makefile(一)

在一個文件夾中建一個c文件 //main.c #include<stdio.h> int main() {printf("version 1.0");return 0; } 在當前目錄下編寫makefile文件 //makefile: test : main.o //一種依賴關系聲明&#xff0c;生成test可執行程序需要以來main.o文件gcc -o test main.…

Defunct進程 僵尸進程

在測試基于 DirectFBGstreamer 的視頻聯播系統的一個 Demo 的時候&#xff0c;其中大量使用 system 調用的語句&#xff0c;例如在 menu 代碼中的 system("./play") &#xff0c;而且多次執行&#xff0c;這種情況下&#xff0c;在 ps -ef 列表中出現了大量的 defunc…

make文件基礎用法

參照&#xff1a;https://www.jianshu.com/p/0b2a7cb9a469 創建工作目錄&#xff0c;包含一下文件 main.cperson.cb.hc.h/*** c.h ***/ //this is c.h /*** b.h ***/ //this is b.h /*** main.c ***/ #include<stdio.h> //#include"a1.h" //#include"b.h&…

一個Linux下C線程池的實現(轉)

1.線程池基本原理 在傳統服務器結構中, 常是 有一個總的 監聽線程監聽有沒有新的用戶連接服務器, 每當有一個新的 用戶進入, 服務器就開啟一個新的線程用戶處理這 個用戶的數據包。這個線程只服務于這個用戶 , 當 用戶與服務器端關閉連接以后, 服務器端銷毀這個線程。然而頻繁地…

二維數組作為函數參數

#include<stdio.h> //#include<> //二位數組作為函數參數時&#xff0c;可以不指定第一個下標 void print_buf(int (*p)[3],int a,int b) //void print_buf(int p[][3],int a,int b) {int i,j;for(i 0 ; i < a; i){for(j 0; j < b; j){printf("p[%…