Day 48 算法笔记之提高篇(4)10.7 关键路径

stack<int> toporder;
bool toplogicalsort(){
	queue<int> q;
	for(int i=0;i<n;i++){
		if(indegree[i]==0){
			q.push(i);
		}
	}
	while(!q.empty()){
		int u = q.front();
		q.pop();
		toporder.push(u);
		for(int i=0;i<g[u].size();i++){
			int v = g[u][i].v;
			indegree[v]--;
			if(indegree[v]==0){
				q.push(v);
			}
			
			if(ve[u]+g[u][i].w>ve[v]){
				ve[v] = ve[u]+g[u][i].w;
			}
		}
	
	}
	if(toporder.size()==n) return true;
	else return false;
}
fill(vl,vl+n,ve[n-1]);
while(!toporder.empty()){
	int u = toporder.top();
	toporder.pop();
	for(int i=0;i<g[u].size();i++){
		if(vl[v]-g[u][i].w<vl[u]){
			vl[u] = vl[v] - g[u][i].w
		}
	}
}
int criticalpath(){
	memset(ve,0,sizeof(ve));
	if(toplogicalsort()==false){
		return -1;
	}
	fill(vl,vl+n,ve[n-1]);
	while(!toporder.empty()){
		int u = toporder.top();
		toporder.pop();
		for(int i=0;i<g[u].size();i++){
			int v = g[u][i].v;
			if(vl[v]-g[u][i].w<vl[u]){
				vl[u] = vl[v] - g[u][i].w;
			}
		}
	}
	
	for(int u =0;u<n;u++){
		for(int i=0;i<g[u].size();i++){
			int v = g[u][i].v,w=g[u][i].w;
			int e = ve[u],l=vl[v]-w;
			if(e==l){
				printf("%d->%d\n",u,v);
			}
		}
	}
	return ve[n-1];
}

猜你喜欢

转载自blog.csdn.net/aixiaoxiao13/article/details/121637507