数学逻辑上,
计算最早开始时间:
1.若任务无依赖项,则最早开始时间 = 1;
2.若任务含依赖项,则最早开始时间 = 任务的依赖项的最早开始时间+任务的依赖项的训练时间
计算最晚开始时间:
1.若任务无依赖项,则最早开始时间 = 训练时间+1 -任务的训练时间;
2.若任务含依赖项,则最早开始时间 = 任务的依赖项的最晚开始时间+任务的依赖项的训练时间
代码实现上,
采用结构体实现每个任务的依赖编号,需要的训练时间,最早开始时间和最晚开始时间。
#include<iostream>
#include<cmath>
using namespace std;
#define MAX 101
struct task_data{
int reli_task; // 依赖编号
int need_time; // 需要的时间
int early_start; // 最早开始时间
int last_start; // 最晚开始时间
};
int main()
{
struct task_data a[MAX];
int n,m; // n天时间,m个任务
//数据的输入
cin>>n>>m;
for(int i = 0;i<m;i++)
{
cin>>a[i].reli_task;
}
for(int i = 0;i<m;i++)
{
cin>>a[i].need_time;
}
// 对于数据进行运算
for(int i = 0;i<m;i++)
{
if(a[i].reli_task == 0)
{
a[i].early_start = 1;
a[i].last_start = n+1-a[i].need_time;
}
else
{
// 这里没有修改坐标;将第一个任务作为下表为零的任务
a[i].early_start = a[a[i].reli_task-1].early_start
+a[a[i].reli_task-1].need_time;
a[i].last_start = a[a[i].reli_task-1].last_start
+a[a[i].reli_task-1].need_time;
}
}
// 数据的输出
int last_flag = 0;
for(int i = 0;i<m;i++)
{
cout<<a[i].early_start<<" ";
if(a[i].last_start>n)
{
last_flag = 1;
}
}
if(last_flag == 0)
{
cout<<endl;
for(int i = 0;i<m;i++)
{
cout<<a[i].last_start<<" ";
}
}
return 0;
}