数据结构课程设计2022夏-7-2 关键路径
作者:@kuaiquxie
作者的github:https://github.com/bitebita
本文为作者原创,如需转载,请注明出处:https://www.cnblogs.com/dzwj/p/16455684.html
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
解析:
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int N=1010; int a[N][N],n; int in[N],dis[N]; int out[N],rdis[N]; int vec[N],cnt; int main(){ int m; while(cin>>n>>m){ cnt=0; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ a[i][j]=0; } } memset(in,0,sizeof in); memset(out,0,sizeof out); memset(dis,0,sizeof dis); memset(rdis,0x3f,sizeof rdis); for(int i=0;i<m;i++){ int u,v,d; cin>>u>>v>>d; in[v]++; out[u]++; a[u][v]=d; } int o=-1; bool ji=0; for(int i=1;i<=n;i++){ if(in[i]==0){ if(o==-1){ o=i; }else{ ji=1; } } } if(o==-1||ji==1){ cout<<"unworkable project"<<endl; continue; } vec[cnt++]=o; while(cnt>0){ int p=vec[--cnt]; for(int i=1;i<=n;i++){ if(a[p][i]>0){ in[i]--; if(dis[i]<dis[p]+a[p][i]){ dis[i]=dis[p]+a[p][i]; } if(in[i]==0){ vec[cnt++]=i; } } } } bool fl=1; for(int i=1;i<=n;i++){ if(in[i]>0){ fl=0; } } if(fl==0){ cout<<"unworkable project"<<endl; continue; } int tmp=vec[0]; rdis[vec[0]]=dis[vec[0]]; cnt++; while(cnt>0){ int p=vec[--cnt]; for(int i=1;i<=n;i++){ if(a[i][p]>0){ out[i]--; if(rdis[i]>rdis[p]-a[i][p]){ rdis[i]=rdis[p]-a[i][p]; } if(out[i]==0){ vec[cnt++]=i; } } } } cout<<dis[tmp]<<endl; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(a[i][j]>0&&dis[i]==rdis[i]&&dis[j]==rdis[j]&&dis[i]+a[i][j]==dis[j] ){ cout<<i<<"->"<<j<<endl; } } } } return 0; }
分类:
软件工程实验
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2021-07-07 学习java 7.7