题意:给n条指令,0到n-1,有些指令之间有依赖关系(x到y需要一段安全时间z),除这种关系之外所有指令可以同时进行;求CPU执行的最少时间。
思路:就是求DAG上的最长路径(dp求解),记忆化搜索,防止超时。
AC代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=10000+10;
int g[1100][1100];
int n,m;
struct node{
int x,y;
node(int x=0,int y=0):x(x),y(y){}
}nt[maxn];
int t[1100][1100];
int d[1100];
int dp(int i){
int&ans=d[i];
if(ans>0)return ans;
ans=1; //如果是这条路上的最后一条指令,直接返回(if语句不满足条件了,花费时间为1)
for(int j=0;j<n;j++){
if(g[i][j])ans=max(ans,dp(j)+t[i][j]);
}
return ans;
}
int main(){
while(scanf("%d%d",&n,&m)==2){
memset(d,0,sizeof(d));
memset(g,0,sizeof(g));
memset(t,0,sizeof(t));
for(int i=0;i<m;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
nt[i]=node(a,b);
g[a][b]=1;
t[a][b]=c;
}
int ans=-1;
for(int i=0;i<n;i++){
ans=max(ans,dp(i));
}
printf("%d\n",ans);
}
return 0;
}