7-14 最短工期

Posted hqhq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了7-14 最短工期相关的知识,希望对你有一定的参考价值。

7-14 最短工期?

模型

显然是一个有向图
而且是一个拓扑图,题目模型既是拓扑排序

## 拓扑排序

什么是拓扑图

简单的说就是一个有依赖关系的图,例如完成任务x的时候必须要先完成任务1.2.3.4.5........

什么是拓扑排序

简单的说就是可以通过这个序列去依次完成任务
在这个形成的序列中,某一个元素,它的依赖关系一定在它前面

如何获得拓扑序列呢?

1.首先记录每个点的入度
2.如果这个存在入度为0的点,说明它没有依赖关系,我就可以把它放进序列中
3.当我把这个入度为0的点加入序列的时候,我就要把我所指向的点,入度减一
4.重复执行以上几个操作,直到没有入度为0的点

代码


#include<stdio.h>
int n,m,ans;
int g[105][105],d[105],cnt,f[105];
int  max(int x,int y)

    if (x>y) return x; else return y;

int main()

    int i,j;
    scanf("%d%d",&n,&m);
    for (i=0; i<n; i++)
        for (j=0; j<n; j++) g[i][j]=-1; // i,j之间是否存在一条边
    for (i=1; i<=m; i++)
    
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        g[x][y]=z; d[y]++; //每加入一条边  度数加一
       // printf("             %d %d\n",y,d[y]);
    
    while (1)
    
        int flag=0;
        for (i=0; i<n; i++)
        

            if (d[i]==0)
            
                d[i]=-1;//防止重复计算
                flag=1; //是否存在新的入度为0的点
                cnt++; // 入度为0点也就是加入拓扑序列的总个数
                for (j=0; j<n; j++) if (g[i][j]!=-1)
                
                    d[j]--; // 入度减一
                    f[j]=max(f[j],f[i]+g[i][j]); //选择最长的
                    ans=max(ans,f[j]);
                
               // printf("%d %d\n",i,d[5]);
            
        
        if (flag==0) break;
    
    //printf("%d\n",cnt);
    if (cnt!=n) printf("Impossible\n");
    else printf("%d\n",ans);
    return 0;


以上是关于7-14 最短工期的主要内容,如果未能解决你的问题,请参考以下文章

2021.7.14提高B组模拟3T3 软件公司 (二分)(dp)

Project 摘要任务的工期出现小数位

project2007 总任务工期为小数,如何破解?

project2007工期为啥会有小数点?

HDU3247 Resource Archiver(AC自动机+BFS+DP)

Project中工期出现小数的问题。