版权声明:https://blog.csdn.net/huashuimu2003 https://blog.csdn.net/huashuimu2003/article/details/84435876
题目
描述 Description
Oj上有很多题是联系的,对于某一类型的题目,必须要把基础的题目做完,再总结一段时间,才能够去切不水的题目。
在noip最后一周,老师布置了很多很多的题目来切。
为了更好的备考,为了更好的打好基础,老师规定切题的规则如下:
对于老师布置的某项基础作业X,神犇必须要在做完基础作业X之后的 下Z分钟, (如果难理解,看样例)才能开始做另外一项作业Y,按照老师的说法:间隔的时间是为了让你反思的。
但神犇具有同时完成多项作业的能力,并且神犇切任何的题目只需要一分钟!!
现在神犇想知道,他需要多少时间来完成作业,数据保证神犇可以完成作业。
输入格式 Input Format
第一行两个整数N,M表示作业数和作业之间延迟关系的数量
第2-M+1行,每行3个整数,X,Y,Z(X,Y在0~N-1之间)表示作业y必须要在x完成后的下Z分钟才能去做。
输出格式 Output Format
一行一个整数,表示最少的时间(分钟)
样例输入 Sample Input
5 2
1 2 1
3 4 1
样例输出 Sample Output
2
时间限制 Time Limitation
1s
注释 Hint
样例解释:第一分钟1,3和0同时做,第二分钟2和4同时做
【数据范围】
20% 1<=n,m<=20;
100% 1<=n<=400, 1<=m<=5000.
代码
#include<bits/stdc++.h>
using namespace std;
const int _=100010;
inline int read()
{
int f=1,num=0;
char ch=getchar();
while (ch<'0'||ch>'9') { if (ch=='-') f=-1; ch=getchar(); }
while (ch>='0'&&ch<='9') num=(num<<1)+(num<<3)+ch-'0', ch=getchar();
return num*f;
}
int n,m,ans,d[_],In[_];
int ver[_],edge[_],Next[_],head[_],len;
void add(int x,int y,int z)
{
ver[++len]=y,edge[len]=z,Next[len]=head[x],head[x]=len;
}
queue<int>q;
void topsort()
{
for (int i=0;i<n;++i)
if (!In[i])
{
q.push(i);
d[i]=1;
}
while (!q.empty())
{
int x=q.front();
q.pop();
for (int i=head[x];i;i=Next[i])
{
int y=ver[i];
d[y]=max(d[y],d[x]+edge[i]);
--In[y];
if (!In[y]) q.push(y);
}
}
}
int main()
{
n=read(),m=read();
for (int i=1;i<=m;++i)
{
int x=read(),y=read(),z=read();
add(x,y,z);
++In[y];
}
topsort();
for (int i=0;i<n;++i)
ans=max(ans,d[i]);
printf("%d\n",max(ans,1));
return 0;
}