p1828 [noip2011模拟赛]切水题

版权声明: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;
}

猜你喜欢

转载自blog.csdn.net/huashuimu2003/article/details/84435876