一.原题链接: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;
}