最短工期 (25 分)【拓扑排序模板】
立志用最少的代碼做最高效的表達(dá)
一個(gè)項(xiàng)目由若干個(gè)任務(wù)組成,任務(wù)之間有先后依賴順序。項(xiàng)目經(jīng)理需要設(shè)置一系列里程碑,在每個(gè)里程碑節(jié)點(diǎn)處檢查任務(wù)的完成情況,并啟動(dòng)后續(xù)的任務(wù)。現(xiàn)給定一個(gè)項(xiàng)目中各個(gè)任務(wù)之間的關(guān)系,請你計(jì)算出這個(gè)項(xiàng)目的最早完工時(shí)間。
輸入格式:
首先第一行給出兩個(gè)正整數(shù):項(xiàng)目里程碑的數(shù)量 N(≤100)和任務(wù)總數(shù) M。這里的里程碑從 0 到 N?1 編號。隨后 M 行,每行給出一項(xiàng)任務(wù)的描述,格式為“任務(wù)起始里程碑 任務(wù)結(jié)束里程碑 工作時(shí)長”,三個(gè)數(shù)字均為非負(fù)整數(shù),以空格分隔。
輸出格式:
如果整個(gè)項(xiàng)目的安排是合理可行的,在一行中輸出最早完工時(shí)間;否則輸出"Impossible"。
輸入樣例 1:
9 12
0 1 6
0 2 4
0 3 5
1 4 1
2 4 1
3 5 2
5 4 0
4 6 9
4 7 7
5 7 4
6 8 2
7 8 4
輸出樣例 1:
18
輸入樣例 2:
4 5
0 1 1
0 2 2
2 1 3
1 3 4
3 2 5
輸出樣例 2:
Impossible
拓?fù)渑判蚰0孱}。(其實(shí)用dfs硬搜也能解出來-,-)
步驟:
1、定義隊(duì)列,存入起始活動(dòng)(不止一個(gè))
2、對每個(gè)活動(dòng)指向的活動(dòng)進(jìn)行遍歷,同時(shí)更新每個(gè)活動(dòng)的最早完成時(shí)間。
3、若遍歷的點(diǎn)等于n,則證明成功,輸出最終活動(dòng)的最早完成時(shí)間;反之輸出Impossible
#include<iostream> #include<cstdio> #include<vector> #include<queue> /* 拓?fù)渑判?#xff0c; 隊(duì)列存儲(chǔ)、實(shí)時(shí)更新最短路徑。 */ using namespace std; const int N = 105; vector<pair<int, int> >G[N]; //第i個(gè)節(jié)點(diǎn)到到某個(gè)節(jié)點(diǎn)+到該節(jié)點(diǎn)花費(fèi)的時(shí)間 int n, m; int in[N]; //存儲(chǔ)所有節(jié)點(diǎn)的入度數(shù) int ans[N]; int dis[N]; //存儲(chǔ)完成某活動(dòng)所需的最短時(shí)間 int tot = 0; //記錄已遍歷的節(jié)點(diǎn) int main() {cin >> n >> m;for(int i = 0, u, v, w; i < m; i++) {cin >> u >> v >> w;in[v]++; //v節(jié)點(diǎn)出度+1 G[u].push_back({v, w});}queue<int>Q;for(int i = 0; i < n; i++) if(!in[i]) Q.push(i); //入度為0的,都是起點(diǎn)while(!Q.empty()) {int u = Q.front();Q.pop(), ans[tot++] = u;for(auto x : G[u]) {int v = x.first, w = x.second;if(--in[v] == 0) //因?yàn)橐粋€(gè)點(diǎn)不能重復(fù)入隊(duì),因此等度數(shù)減為0(其前序的節(jié)點(diǎn)都遍歷完)時(shí)再入度。 Q.push(v);if(dis[v] < dis[u] + w)dis[v] = dis[u] + w;}}if(tot == n) { //如果計(jì)數(shù)節(jié)點(diǎn)等于n,代表成功 int ans1 = 0;for(int i = 0; i < n; i++) //找最大值 ans1 = max(ans1, dis[i]);cout << ans1 << '\n'; } else cout << "Impossible";return 0; }
耗時(shí)
????????——弱小和無知不是生存的障礙,傲慢才是。
總結(jié)
以上是生活随笔為你收集整理的最短工期 (25 分)【拓扑排序模板】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 城市间紧急救援 (25 分)【dijks
- 下一篇: 红色警报 (25 分)【测试点分析】【两