题解 P1113 【杂务】
暴力,当一个任务完成时,看其他的任务能不能完成,但好像比拓扑排序慢一些
#include<iostream>
#include<queue>
using namespace std;
int n;
int len[10005];//rt
bool cs[10005][10005];//cs[i][j]:j是否为i的先决条件
bool pd[10005];
struct axx
{
int num;
int wz;
bool operator <(const axx p)const
{
return num>p.num;
}
axx(int a,int b)
{
wz=a;
num=b;
}
};
int time[10005];//最快i的完成时间
int tj[10005];//i有多少个先决条件
priority_queue<axx> bd;//所有同时进行的工序,使完成最早的先输出
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int x;
cin>>x>>len[i];
bool xpd=true;
while(xpd==true)
{
int y;
cin>>y;
if(y==0)
{
xpd=false;
}
else
{
tj[x]++;
cs[x][y]=true;
}
}
}
bd.push(axx(1,len[1]));
time[1]=len[1];
pd[1]=true;
while(!bd.empty())
{
axx u=bd.top();
bd.pop();
pd[u.wz]=true;
for(int i=1;i<=n;i++)
{
if(cs[i][u.wz]==true&&pd[i]==false)
{
cs[i][u.wz]=false;
tj[i]--;
if(tj[i]==0)
{
time[i]=u.num+len[i];
bd.push(axx(i,time[i]));
}
}
}
}
int axxmax=0;
for(int i=1;i<=n;i++)
{
axxmax=max(axxmax,time[i]);
}
cout<<axxmax<<endl;
return 0;
}