洛谷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;
}