数据结构课程设计2022夏7-2 关键路径
7-2 关键路径
假定一个工程由若干子任务构成,使用一个包含n个顶点、e条边的AOE网表示该工程,顶点编号为1至n,有向边表示该工程的每个子任务,边的权值表示完成该子任务所需的时间,假定网中只含一个源点和一个汇点。请编写程序求出该工程的所有关键活动,并计算完成该工程所需的最短时间。
输入格式:
每个测试点包含多组测试数据。每组数据第一行为2个整数n和e,均不超过200,分别表示AOE网的顶点数和边数。接下来e行表示每条边的信息,每行为3个正整数a、b、c,其中a和b表示该边的端点编号,c表示权值。各边并不一定按端点编号顺序排列,且各顶点并不一定按拓扑序排列。
输出格式:
对每组数据,若工程不可行(AOE网中存在环),输出“unworkable project”;若工程可行,则输出第一行为完成工程所需的最短时间,并从第2行开始输出关键活动,每个关键活动占一行,格式为i->j,其中i和j表示关键活动所在边的端点编号。各关键活动输出顺序为:按i的递增顺序输出,若多个关键活动的i值相同,则按j的递增顺序输出。
输入样例:
4 4
1 2 6
1 3 4
2 4 1
3 4 1
输出样例:
7
1->2
2->4
代码长度限制
16 KB
时间限制
100 ms
内存限制
64 MB
#include<iostream> #include<queue> #include<cmath> #include<cstring> using namespace std; #define maxx 200 #define INF 10000 int edges[maxx][maxx]; int in[maxx] = { 0 }; int out[maxx] = { 0 }; int early[maxx] = { 0 }; int late[maxx]; int max1[1]={0}; int s[maxx]={0}; int ne, nv; int l=0; int temp1=0; int earlytime() { int cnt = 0; queue<int>qu; for (int i = 1; i <= nv; i++) { if (in[i] == 0) qu.push(i); } while (!qu.empty()) { int temp = qu.front(); cnt++; qu.pop(); for (int i = 1; i <= nv; i++) { if (edges[temp][i] != INF) { in[i]--; early[i] = max(early[i], early[temp] + edges[temp][i]); if (in[i] == 0)qu.push(i); } } } if (cnt != nv) return -1; else { int amount = -999; for (int i = 1; i <= nv; i++) { if (early[i] > amount) amount = early[i]; } return amount; } } void latetime(int count) { queue<int>qu; for (int i = 1; i <= nv; i++) { if (out[i] == 0) { qu.push(i); late[i] = count; } } while (!qu.empty()) { int temp = qu.front(); qu.pop(); for (int i = nv; i >=1; i--) { if (edges[i][temp] != INF)//edges[i][temp] { out[i]--; late[i] = min(late[i], late[temp] - edges[i][temp]); if (out[i] == 0) qu.push(i); } } } } int main() { int n, m; while(cin >> n >> m){ nv = n; ne = m; memset(in,0,sizeof in); memset(out,0,sizeof out); memset(early,0,sizeof early); memset(late,0,sizeof late); memset(s,0,sizeof s); for (int i = 0; i < maxx; i++) { late[i] = INF; for (int j = 0; j < maxx; j++) { edges[i][j] = INF; } } for (int i = 1; i <= ne; i++) { int a, b, c; cin >> a >> b >> c; edges[a][b] = c; in[b]++; out[a]++; } int count = earlytime(); if (count == -1) { cout << "unworkable project"<<endl; continue; } latetime(count); cout << count << endl; for (int i = 1; i <= nv; i++) { for (int j = nv; j >= 1; j--) { if (edges[i][j] != INF&&late[j] - early[i]==edges[i][j]) { s[2*l]=i; s[2*l+1]=j; ++l; max1[0]++; } } } for(int k =0;k<max1[0];k++){ if(s[2*k]==s[2*k+2]){ if(s[2*k+1]>s[2*k+3]){ temp1=s[2*k+1]; s[2*k+1]=s[2*k+3]; s[2*k+3]=temp1; } } } for(int k=0;k<max1[0];k++){ cout<<s[2*k]<<"->"<<s[2*k+1]<<endl; } } }