关键路径?
  • 板块P1807 最长路
  • 楼主zypqqq
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/4/21 14:02
  • 上次更新2023/10/23 17:55:44
查看原帖
关键路径?
772376
zypqqq楼主2023/4/21 14:02
#include<bits/stdc++.h>
using namespace std;
int a[5010][5010],w[5010][5010],cd[5010],rd[5010],sd,zd,topo[5010],t,ve[5010],vl[5010],e[5010],l[5010],b[5010][5010],path[5010],cd2[5010],ans;
stack <int> s;
int n,m;
void jinatu(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v,q;
		cin>>u>>v>>q;
		cd[u]++;
		rd[v]++;
		a[u][cd[u]]=v;
		w[u][v]=q;
	}
	for(int i=1;i<=n;i++){
		if(rd[i]==0){
			sd=i;
		}
		if(cd[i]==0){
			zd=i;
		}
	}
}
bool topo2(){
	int num=0;
	s.push(sd);
	while(!s.empty()){
		int i=s.top();
		s.pop();
		num++;
		topo[++t]=i;
		for(int j=1;j<=cd[i];j++){
			int k=a[i][j];
			rd[k]--;
			ve[k]=max(ve[k],ve[i]+w[i][k]);
			if(rd[k]==0){
				s.push(k);
			}
		}
	}
	if(num==n){
		return true;
	}else{
		return false;
	}
}
void guanjianlujing(){
	if(topo2()){
		for(int i=1;i<=n;i++){
			vl[i]=ve[zd];
		}
		for(int i=n;i>=1;i--){
			int k=topo[i];
			for(int j=cd[k];j>=1;j--){
				int h=a[k][j];
				vl[k]=min(vl[k],vl[h]-w[k][h]);
			}
		}
	}
	int j=0;
	for(int i=1;i<=n;i++){
		for(int k=1;k<=cd[i];k++){
			int h=a[i][k];
			e[++j]=ve[i];
			l[j]=vl[h]-w[i][h];
			if(e[j]==l[j]){
				b[i][++cd2[i]]=k;
				ans+=w[i][h];
			}
		}
	}
}
int main(){
	jinatu();
	guanjianlujing();
	cout<<ans<<" ";
	return 0;
}
2023/4/21 14:02
加载中...