链接:点击打开链接
链接:给出N和M代表编号0~N-1个任务,和M条关系,每条关系由三个字母组成分别为X,Y,Z代表想要完成Y必须先完成X并花费Z个时间,电脑可以同时完成多个任务处理,一次花费一个单位时间。问完成0~N-1个任务需要多少时间,具体看样例,样例意思是先完成0,1,3然后完成2,4共花费2个单位时间
代码:
#include <map>
#include <queue>
#include <stack>
#include <string>
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int n,m;
struct node{
int to,val;
};
vector<node> G[1005];
int d[1005],deg[1005];
void topo(){
int i,j,u,v,w;
queue<int> qu;
for(i=0;i<n;i++)
if(deg[i]==0){
qu.push(i);
d[i]=1;
}
while(qu.size()){
u=qu.front();
qu.pop();
for(i=0;i<G[u].size();i++){
v=G[u][i].to;
w=G[u][i].val;
deg[v]--;
d[v]=max(d[v],d[u]+w);
if(deg[v]==0)
qu.push(v);
}
}
}
int main(){ //就是求关键路劲topo更新一下,
int i,j,u,v,w,ans; //按连通分量最短路一下应该也可以
while(scanf("%d%d",&n,&m)!=EOF){
for(i=0;i<n;i++){
G[i].clear();
d[i]=deg[i]=0;
}
for(i=1;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);
G[u].push_back((node){v,w});
deg[v]++;
}
topo();
ans=0;
for(i=0;i<n;i++)
ans=max(ans,d[i]);
printf("%d\n",ans);
}
return 0;
}