题意
N条指令M个约束条件,每条指令之间必须有安全间隔,执行一条指令用时1s
思路
关键路径,类似拓扑排序中求最长路径。设定map容器、入度为0的队列、入度数组、到每一点最长的路。
代码
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct edge{
int next;
int cost;
};
int main(int argc, char *argv[])
{
int n,m;
while(cin>>n>>m){
int a;
vector<edge> map[1005];
queue<int> zero;
edge temp;
int in[1005]={0},step[1005]={0};
while(m--){
cin>>a>>temp.next>>temp.cost;
map[a].push_back(temp);
in[temp.next]++;
}
for(int i=0;i<n;i++){
if(in[i]==0){
zero.push(i);
step[i]=1;//入度为0的起点初设1,和终点用时抵消
}
}
int time=0;
while (!zero.empty()){
int top=zero.front();
zero.pop();
for(int i=0,size=map[top].size();i<size;i++){
int next=map[top][i].next;
int cost=map[top][i].cost;
step[next]=max(step[next],step[top]+cost);//选择最长路中关键点的最迟开始时间
in[next]--;
if(in[next]==0){
zero.push(next);
}
}
}
for(int i=0;i<n;i++){
if(time<step[i]){
time=step[i];
}
}
cout<<time<<endl;
}
return 0;
}