p1828 [noip2011模擬賽]切水題
阿新 • • 發佈:2018-11-24
題目
描述 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;
}