HDU4109 Instrction Arrangement 拓扑排序 关键路径

Problem Description

Ali has taken the Computer Organization and Architecture course this term. He learned that there may be dependence between instructions, like WAR (write after read), WAW, RAW.

If the distance between two instructions is less than the Safe Distance, it will result in hazard, which may cause wrong result. So we need to design special circuit to eliminate hazard. However the most simple way to solve this problem is to add bubbles (useless
operation), which means wasting time to ensure that the distance between two instructions is not smaller than the Safe Distance.

The definition of the distance between two instructions is the difference between their beginning times.

Now we have many instructions, and we know the dependent relations and Safe Distances between instructions. We also have a very strong CPU with infinite number of cores, so you can run as many instructions as you want simultaneity, and the CPU is so fast that
it just cost 1ns to finish any instruction.

Your job is to rearrange the instructions so that the CPU can finish all the instructions using minimum time.

Input

The input consists several testcases.

The first line has two integers N, M (N <= 1000, M <= 10000), means that there are N instructions and M dependent relations.

The following M lines, each contains three integers X, Y , Z, means the Safe Distance between X and Y is Z, and Y should run after X. The instructions are numbered from 0 to N - 1.

Output

Print one integer, the minimum time the CPU needs to run.

Sample Input

5 2
1 2 1
3 4 1

Sample Output

2

Hint

In the 1st ns, instruction 0, 1 and 3 are executed;
In the 2nd ns, instruction 2 and 4 are executed.
So the answer should be 2.


 

题意:

可以理解为有m个工程和N条生产线,每个生产线完成都需要一定的时间,每个工程开始的前提是连接它的生产线全部完成。可以多条生产线同时运作,求所有工程完成的最早时间(工程开始立即完成)。

思路:

通过拓扑排序每次找入度为0的点,依次计算所有工程的结束时间,得出的最大时间 即为最早时间

这里用邻接表存每个点联系的所有的边。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
struct node
{
    int to,value;
};
vector<node>next[1005];      //向量+结构体 邻接表
int in_degree[1005];          //节点的入度
int finish[1005];            //节点的开始时间
int m,n;
void topsort()
{
    queue<int>q;
    int i,j;
    int now;
    for(i=0;i<m;i++)
        if(in_degree[i]==0)
            {
                finish[i]=1;       //题意
                q.push(i);
            }
    while(!q.empty())
    {
        now=q.front();
      //  cout<<now<<endl;
        q.pop();
        for(i=0;i<next[now].size();i++)
        {
            int b=next[now][i].to;
            int v=next[now][i].value;
            finish[b]=max(finish[b],finish[now]+v);     //某个工程的开始时间
            in_degree[b]--;
            if(in_degree[b]==0)
                q.push(b);
        }
    }
    return;
}
int main()
{
    int i,j;
    while(~scanf("%d%d",&m,&n))
    {
        memset(finish,0,sizeof(finish));
        memset(in_degree,0,sizeof(in_degree));
        for(i=0; i<=m; i++)
            next[i].clear();
        int a,b,c;
        node d;
        while(n--)
        {
            scanf("%d%d%d",&a,&b,&c);
            d.to=b;
            d.value=c;
            next[a].push_back(d);
            in_degree[b]++;
        }
        topsort();
        int ans=0;
        for(i=0;i<=m;i++)
            if(finish[i]>ans)
                ans=finish[i];
            cout<<ans<<endl;
    }
    return 0;
}

时间: 2024-10-29 20:33:44

HDU4109 Instrction Arrangement 拓扑排序 关键路径的相关文章

PAT 关键活动 拓扑排序-关键路径

链接: 关键活动 思路: 1.首先通过队列加邻接表完成拓扑排序: 所有入度为0的节点a入队 在邻接表中找到a的所有后继节点 后继节点入度-1 如果后继节点入度为0 则后继节点入队 2.当图中出现环时则任务调度不可行: 只要判断是否入队n次即可 3.在拓扑排序的过程中用path数组保存所有(关键活动)的前驱节点 最后通过队列和path数组 从最终活动依次往前遍历 保存出现的所有边 排序输出即可 代码: #include<iostream> #include<cstdio> #incl

HDU4109 Instrction Arrangement

关键路径入门题目 拓扑排序 每次选入度为0的点 关键路径 每个点称为活动 只有当一个活动(也就是点)的入度为0 才能做这个活动 假设一个点入度为1 被一个点x 一条弧w指着 要等这个点先等x昨晚 然后再等w的时间才能 才能执行这个点的活动 显然这个过程所需时间 就是 x+w 以此类推 一个点被n个点分别用n条弧指着 他的最早开始执行时间是 X[i] + W[i]的最大值 把全部指向他的活动+弧做完了才能开始 实现 在拓扑的排序的时候 取出节点now 每次边指向的节点都判断 他的开始时间finis

hdu Instrction Arrangement(关键路径 + 拓扑排序)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意: 5 2                     //5个进程(编号从 0 开始)需要被执行,有2个约束条件, 问全部执行完成的最短时间. 1 2 1                   //1号要在2号进程执行完成的后一纳秒执行 3 4 1 Sample Output 2 关键路径: 基于AOE网(Activity On Edge),也就是说,每一条边代表着一个事件的发生,边的权值即为

图的拓扑排序、关键路径、最短路径算法 -- C++实现

一:拓扑排序 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前.通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列. 拓扑排序就是要找到入度为0的顶点,并依次压栈.首先将栈顶顶点输出,删除以此顶点为弧尾的顶点,并更新其他顶点的入度.若入度为0,则继续压栈.更新完毕继续出栈,直至栈空.元素出栈并输出

DAG的运用:拓扑排序(AOV),关键路径(AOE)与dp的关系

dp在DAG中有两个运用,一个是固定终点和起点的最长路(最短路) 其中最长路的算法就是关键路径(AOE)的算法. 下面是代码 #include<cstdio> #include<algorithm> #define maxn 2001 using namespace std; int a[10],head[maxn],n,p,f[maxn],tp[maxn],de[maxn],ds[maxn]; struct ss { int to,w,last; }x[maxn*1000]; v

拓扑排序之关键路径(深度优先搜索)

/* Name: 拓扑排序之关键路径(深度优先搜索) Copyright: Author: 巧若拙 Date: 17-11-14 21:02 Description: 拓扑排序之关键路径 若在带权的有向图中,以顶点表示事件,以有向边表示活动,边上的权值表示活动的开销(如该活动持续时间), 则此带权的有向图称为边表示活动的网 (Activity on Edge Network) ,简称 AOE 网. (1)AOV 网具有的性质 ⒈ 只有在某顶点所代表的事件发生后,从该顶点出发的各有向边所代表的活动

[从今天开始修炼数据结构]无环图的应用 —— 拓扑排序和关键路径算法

上一篇文章我们学习了最短路径的两个算法.它们是有环图的应用.下面我们来谈谈无环图的应用. 一.拓扑排序 博主大学学的是土木工程,在老本行,施工时很关键的节约人力时间成本的一项就是流水施工,钢筋没绑完,浇筑水泥的那帮兄弟就得在那等着,所以安排好流水施工,让工作周期能很好地衔接就很关键.这样的工程活动,抽象成图的话是无环的有向图. 在表示工程的有向图中,用顶点表示活动,弧表示活动之间的优先关系,这样的有向图为顶点表示活动的网,成为AOV网(Active On Vertex Network) ※ 若在

有向无环图的应用—AOV网 和 拓扑排序

有向无环图:无环的有向图,简称 DAG (Directed Acycline Graph) 图. 一个有向图的生成树是一个有向树,一个非连通有向图的若干强连通分量生成若干有向树,这些有向数形成生成森林. 在工程计划和管理方面的应用 除最简单的情况之外,几乎所有的工程都可分为若干个称作“活动”的子工程,并且这些子工程之间通常受着一定条件的约束,例如:其中某些子工程必须在另一些子工 程完成之后才能开始.对整个工程和系统,人们关心的是两方面的问题: 一是工程能否顺利进行,即工程流程是否“合理”: 二是

数据结构 - 拓扑排序

应用背景 学生选修课程问题 顶点--表示课程 有向弧--表示先决条件,若课程i是课程j的先决条件,则图中有弧(i,j) 学生应按怎样的顺序学习这些课程,才能无矛盾.顺利地完成学业--拓扑排序 拓扑序列是有向无环图中各顶点构成的有序序列.该序列满足如下条件:如果图中一顶点vi到另一顶点vj存在一条路径,那么vj在此图的拓扑排序序列中位于vi之后. 有向无环图(DAG)和 AOV网 有向无环图"(Directed Acyclic Graph,简称DAG AOV网 (Activity On Verte