7-8 最短工期(C语言)

一个项目由若干个任务组成,任务之间有先后依赖顺序。项目经理需要设置一系列里程碑,在每个里程碑节点处检查任务的完成情况,并启动后续的任务。现给定一个项目中各个任务之间的关系,请你计算出这个项目的最早完工时间。

输入格式:

首先第一行给出两个正整数:项目里程碑的数量 N(≤100)和任务总数 M。这里的里程碑从 0 到 N−1 编号。随后 M 行,每行给出一项任务的描述,格式为“任务起始里程碑 任务结束里程碑 工作时长”,三个数字均为非负整数,以空格分隔。

输出格式:

如果整个项目的安排是合理可行的,在一行中输出最早完工时间;否则输出"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

参考代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int n, m, ans;
int mp[100][100];
int l[100], q[100], t[100];

int main() {
    int a, b, c, head = 0, tail = 0;
    scanf("%d%d", &n, &m);
    memset(mp, -1, sizeof(mp));
    for (int i = 0; i < m; i++) {
        scanf("%d%d%d", &a, &b, &c);
        mp[a][b] = c;
        l[b]++;
    }
    for (int i = 0; i < n; i++) {
        if (!l[i]) {
            q[tail++] = i;
        }
    }
    while (head < tail) {
        int temp = q[head++];
        if (t[temp] > ans) ans = t[temp];
        for (int i = 0; i < n; i++) {
            if (mp[temp][i] != -1) {
                l[i]--;
                if (!l[i]) q[tail++] = i;
                if (t[i] < t[temp] + mp[temp][i]) {
                    t[i] = t[temp] + mp[temp][i];
                }
            }
        }
    }
    if (tail < n) printf("Impossible");
    else printf("%d", ans);
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 这个问题需要使用项目管理中的关键路径方法来计算。首先,需要确定每个任务的最早开始时间和最晚结束时间,以及每个任务的持续时间。然后,根据任务之间依赖关系,计算出每个任务的最早结束时间和最晚开始时间。最后,确定整个项目的关键路径,即所有任务中最长的路径,这个路径上的任务决定了整个项目的最早完工时间。 ### 回答2: 项目的最早完工时间(Early Finish Time,EFT)是指所有任务的最早完成时间的最大值。为了计算最早完成时间,需要任务进行网络分析,确定任务之间依赖关系和时间关系,然后按照以下步骤进行计算: 1. 列出任务清单:将项目中涉及到的所有任务列出来,并标注它们之间的前驱后继关系和持续时间。 2. 绘制网络图:根据任务清单绘制PERT图或Gantt图,标注每个任务的持续时间、最早开始时间、最晚开始时间、最早完成时间和最晚完成时间。 3. 计算最早开始时间和最早完成时间:从起始点开始,按照网络图进行前向推算,计算出每个任务的最早开始时间和最早完成时间,以确定整个项目的最早完成时间。 4. 计算最晚开始时间和最晚完成时间:从终点开始,按照网络图进行反向推算,计算出每个任务的最晚开始时间和最晚完成时间,以确定每个任务的浮动时间。 5. 识别关键路径:关键路径是指在整个项目范围内有最大浮动时间的路径,它决定了整个项目最短完成时间。 6. 确定里程碑节点:依照项目计划中设定的里程碑节点对关键任务完成时间进行检查,并启动后续的任务,以确保项目按计划按时完成。 在计算最早完成时间时,需要注意不能忽略任务之间依赖关系和时间关系,否则会导致计算结果不准确。同时,需要进行合理的时间缓冲和风险评估,以确保项目计划的可行性和稳定性。 ### 回答3: 在计算项目的最早完工时间之前,我们需要先了解以下几个概念: 1. 任务项目的基本单位,需要完成一定的工作量才能达成项目目标。 2. 先后依赖顺序任务之间先后顺序关系,即完成某个任务需要完成另外一个或多个任务。 3. 里程碑:项目经理为了检查任务的完成情况设置的关键节点,是项目计划的重要组成部分。 4. 最早完工时间(ES):所有任务完成所需的最短时间。 在计算项目的最早完工时间时,需要进行如下的步骤: 1. 绘制任务网络图:使用箭头表示任务之间先后顺序关系。 2. 计算每个任务的最早开始时间(ES):从图中的起点开始,按照任务之间顺序计算每个任务的最早开始时间,对于每个任务而言,最早开始时间是在其前置任务完成之后,所需的最少时间。 3. 计算每个任务的最早完成时间(EF):最早完成时间等于最早开始时间加上任务工期。 4. 计算整个项目的最早完成时间:整个项目的最早完成时间,即所有任务最早完成时间的最大值。 在计算项目的最早完工时间时,需要注意以下几个问题: 1. 任务之间依赖关系一定要准确无误,否则会导致计算结果出现偏差。 2. 任务所需的时间要尽量准确,过长或过短都会影响计算结果。 3. 任务的优先级要合理设置,否则会导致计算结果出现偏差。 4. 里程碑的设置要恰当,能够清晰地反映项目的进度情况,有助于项目经理更好地管理项目。 综上所述,计算项目的最早完工时间是一个比较复杂的过程,需要准确无误地了解每个任务依赖关系以及所需的时间,只有这样才能够得到准确的计算结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值