// P1113 杂务 https://www.luogu.com.cn/problem/P1113
// 注意此题任务可以并发执行
// 也就是需要更新最大前驱
//
// max(Time[edge[cur][i]],Time[cur]);
// 在Dijkstra 中也有相通的思想:松弛,而Dijkstra中求得是最长得长度
#include<iostream>
#include<vector>
#include<queue>
#include<cstdio>
#include<cstring>
#include <algorithm>
using namespace std;
vector<int> edge[10001];
queue<int> Q;
int inDegree[10001];//入度数
int cost[10001];
int Time[10001];
void init(){
memset(inDegree,0,sizeof(inDegree));
memset(Time,0,sizeof(Time));
memset(cost,0,sizeof(cost));
}
int main(){
freopen("p1113.txt","r",stdin);
init();
int n;
cin>>n;
for(int i=0;i<n;i++){
int to,c,next,in=0;
scanf("%d%d",&to,&c);
cost[to]=c;
while(scanf("%d",&next)&&next){
inDegree[to]++;
edge[next].push_back(to);
}
}
for(int i=1;i<=n;i++){
if(inDegree[i]==0) {
Q.push(i); // 将入度为零的加入队列
}
}
while(!Q.empty()){
int cur = Q.front();Q.pop();
Time[cur] += cost[cur]; // 更新当前 需要时间。
for(int i=0;i<edge[cur].size();i++){
//cout<<edge[cur][i]<<endl;
inDegree[edge[cur][i]]--; // 使访问节点得入度减一
if(inDegree[edge[cur][i]]==0){
Q.push(edge[cur][i]); // 当访问节点得入度为零时在加入队列,
// 这时所有条件都已满足
}
Time[edge[cur][i]]=max(Time[edge[cur][i]],Time[cur]);
}
}
cout<<*max_element(Time,Time+n+1)<<endl;
return 0;
}
洛谷 P1113 拓扑排序
猜你喜欢
转载自www.cnblogs.com/chichina/p/12721332.html
今日推荐
周排行