7-7 最短工期 (25 分)

题目解析

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

代码:

#include <bits/stdc++.h>
using namespace std;
int dis[105][105], ru[105], f[105];
int n, ans, cnt = 0;

void Tsort(){
    while(1){
        int flag=1;
        for(int i=0;i<n;i++){
            if(!ru[i]){//if(ru[i]==0)
                ru[i]--;
                cnt++;
                flag=0;
                for(int j=0;j<n;j++){
                    if(dis[i][j]!=-1){
                        ru[j]--;
                        f[j]=max(f[j],f[i]+dis[i][j]);//里程碑的需要指向里程碑的任务全部完成,故需要时间最长的路径
                        ans=max(f[j],ans);//如果能完成工程,总时间最长的那条路径,一定遍历全部结点的路径
                    }
                }
            }
        }
        if(flag==1) break;
    }
    if(cnt==n) cout<<ans<<endl;
    else cout<<"Impossible"<<endl;
    }

int main()
{
    int m;
    cin >> n >> m;
    memset(dis, -1, sizeof dis);

    while (m--)
    {
        int p, x, y;
        cin >> x >> y >> p;
        dis[x][y] = p;
        ru[y]++;
    }
    Tsort();
    return 0;
}

posted @ 2021-11-22 21:01  kingwzun  阅读(552)  评论(0编辑  收藏  举报