1. 程式人生 > >p1828 [noip2011模擬賽]切水題

p1828 [noip2011模擬賽]切水題

題目

描述 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; }