for(int i=1;i<=n;i++)
if(r[i]==0) sta.push(i);
while(sta.size())
{
int t=sta.top();sta.pop();
cnt++;
for(int i=0;i<c[t].size();i++)
{
int y=c[t][i];
--r[y];
if(r[y]==0) sta.push(y);
……
//以上可以添加其他操作
}
}
if(cnt<n)//说明有环
printf("have circles");
用节点表示事件,边表示活动,边附带权值。
:事件Vi最早发生的时间。
,取所有入度点加边权的最大值。最迟的做完了才能开始做。初始化为0
:事件Vi最迟发生的时间。
,取所有出度点减边权的最小值。保证时间充足的情况下最迟的开始时间。初始化为ve[n]
:活动ai最早发生的时间,即尾节点的Ve值。
:活动ai最早发生的时间,即头节点的Vl值-w。