洛谷P1113 拓扑排序入门!2

洛谷P1113 拓扑排序入门!

这道题真的连题意都不太了解,看来题解半天,勉强弄懂其中奥妙。

当然互相没有关系的杂务可以同时工作

题中这句话真的是精髓,什么叫做同时进行?同时进行的时间怎么算?这些都是懵了,之后在题解中看到大佬画的图才明白原来题目的样子。
此图转载于Nishikino_Curtis大佬

那么这个图是什么意思呢?
就拿点4来举栗子吧:由题目可知,完成4首先要先完成1和2,而1和2又是两个不相干的独立事件,那么他们就可以同时进行,所以从开始到完成4所用时间实际上就等于完成1和2用时较多(max(t[1],t[2]))的加上完成4本身的时间。以此类推,完成7又需要先完成4和5…


以上就是本题目的解题思路,但我还是要聊聊我在做题时遇到的问题。
在之前做题,我一直认为有向图时只能A到B,但题目说完成4需要先完成1和2,那么这个图怎么画,如果画成箭头的方式就不能表示完成4的条件时1和2必须都完成。
实际上,有向图只是表明一种指向关系,至于表示为什么完全看你怎么操作,就像此题一样。


此题AC代码:

#include<iostream>
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;
#define pub push_back
#define pob pop_back
#define N 10005
int ru[N],tim[N],d[N];
vector<int>a[N];
queue<int>q;
int main()
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		int t,ans,tt;
		cin>>t>>tt;
		tim[t]=tt;
		while(cin>>ans&&ans!=0)
		{
			a[ans].pub(t);
			ru[t]++;
		}
	}
	for(int i=1;i<=n;i++)
	{
		if(!ru[i])
		{
			d[i]=tim[i];
			q.push(i);
		}
	}
	while(!q.empty())
	{
		int p=q.front();
		q.pop();
		for(int i=0;i<a[p].size();i++)
		{
			int y=a[p][i];
			d[y]=max(d[y],tim[y]+d[p]);
			ru[y]--;
			if(ru[y]==0)
			q.push(y);
	    }
	}
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		ans=max(ans,d[i]);
	}
	cout<<ans<<endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值