HDU 4109 Instrction Arrangement

来源:互联网 发布:2016网络作家排名 编辑:程序博客网 时间:2024/04/30 15:02

一.原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4109

二.题意:计算机指令之间需要间隔一定的时间,CPU处理指令的时间为1nm,给出指令之间的安全时间,求执行完所有指令的最短时间。

三.思路:

关键路径问题:求在一张有向图中,前面的任务要先执行完才可以执行后面的任务。(其实就是短板效应)。这个算法有2个关键数组:

Ee[]:事件E[i]最早开始时间。(从前往后推,保存大的路径)

El[]:事件E[I]最晚开始时间。(从后往前推,保存小的路径)

如果Ee == El,那么这个是关键事件。

然而这题求个Ee,然后扫一遍求最大的就完了。

四.代码:

#include <iostream>#include <cstdio>#include <cmath>#include <algorithm>#include <cstring>#include <queue>#include <vector>using namespace std;const int MAX_SIZE = 1000,          INF = 0x3f3f3f3f;struct node{    int v, weight;};int cnt[MAX_SIZE], nodeNum, edgeNum, Ee[MAX_SIZE];vector <node> graph[MAX_SIZE];void initGraph(){    int i;    for(i = 0; i < nodeNum; i++)        graph[i].clear();    memset(cnt, 0, sizeof(cnt));    memset(Ee, 0, sizeof(Ee));}void TopoSort(){    int i, cur;    queue <int> que;    for(i = 0; i < nodeNum; i++)        if(0 == cnt[i]){            que.push(i);            Ee[i] = 1;        }    while(!que.empty()){        cur = que.front();        que.pop();        for(i = 0; i < graph[cur].size(); i++){            if(0 == --cnt[graph[cur][i].v])                que.push(graph[cur][i].v);            Ee[graph[cur][i].v] =            max(Ee[cur] + graph[cur][i].weight, Ee[graph[cur][i].v]);        }    }}int main(){    //freopen("in.txt", "r", stdin);    int i, j, u, res;    node temp;    while(cin>>nodeNum>>edgeNum){        initGraph();        for(i = 0; i < edgeNum; i++){            cin>>u>>temp.v>>temp.weight;            graph[u].push_back(temp);            cnt[temp.v]++;        }        TopoSort();        res = -1;        for(i = 0; i < nodeNum; i++)            res = max(Ee[i], res);        cout<<res<<endl;    }    return 0;}


0 0