洛谷 P1113 拓扑排序

// 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;
}

猜你喜欢

转载自www.cnblogs.com/chichina/p/12721332.html
今日推荐