Instrction Arrangement
~~第一道关键路径问题,留下代码纪念,题目大意就是要完成n个任务(0~n-1),每个任务单独最快要1s,而有些任务是需要在某些任务完成后耗时**才能完成的,可多线程进行任务,问完成所有任务需要的最短时间。
拓扑排序、关键路径
/*
Qiu
in[] 任务的入度
T[] 任务最早完成时间
node edge.y y任务在某一任务完成后还需要edge.cost时间完成
v[] 动态存储所有任务的所有后续任务
Q 利用队列存储所有入度为0的任务
ans 记录完成所有任务的最早时间
*/
#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
#define N 1010
int in[N],T[N];
struct node{
int y;
int cost;
}edge;
vector<node>v[N];
void init(int n){
for(int i=0;i<n;i++){
in[i]=0;
T[i]=1;
v[i].clear();
}
}
void topo(int n){
queue<int>Q;
for(int i=0;i<n;i++){
if(in[i]==0){
T[i]=1;
Q.push(i);
}
}
while(!Q.empty()){
int x=Q.front(); Q.pop();
for(int i=0;i<v[x].size();i++){
int y=v[x][i].y;
T[y]=max(T[y],T[x]+v[x][i].cost);
in[y]--;
if(in[y]==0)
Q.push(y);
}
}
int ans=0;
for(int i=0;i<n;i++){
ans=max(T[i],ans);
}
printf("%d\n",ans);
}
int main(){
int x,n,m;
while(scanf("%d%d",&n,&m)!=EOF){
init(n);
for(int i=0;i<m;i++){
scanf("%d%d%d",&x,&edge.y,&edge.cost);
v[x].push_back(edge);
in[edge.y]++;
}
topo(n);
}
return 0;
}