[C++]拓扑排序+DP,23分WA#2~#8
查看原帖
[C++]拓扑排序+DP,23分WA#2~#8
567610
RDFZchenyy楼主2022/3/13 13:48
//P1807 最长路 拓扑排序+DP 
#include<bits/stdc++.h>
using namespace std;

struct point{
	vector<int> edge_to,edge_w;
	int cnt_from=0,cnt_to=0;
};

#define MAXN 2000
#define MEMINF 0x3f
point graph[MAXN];
int n,m;
int read_u,read_v,read_w;
vector<int> top_ans;
int p1,pn;
long long dper[MAXN];
int ans=-1;

void top_sort(){
	queue<int> zero_point;
	int now_deal,now_to;
	for(int i=1;i<=n;i++){
		if(graph[i].cnt_from==0){
			zero_point.push(i);
		}
	}
	while(!zero_point.empty()){
		now_deal=zero_point.front();
		zero_point.pop();
		for(int i=0;i<graph[now_deal].edge_to.size();i++){
			now_to=graph[now_deal].edge_to[i];
			graph[now_to].cnt_from--;
			if(graph[now_to].cnt_from==0){
				zero_point.push(now_to);
			}
		}
		top_ans.push_back(now_deal);		 
	} 
	
	return;
}

int main(){
	memset(dper,-MEMINF,sizeof(dper));
	scanf("%d %d",&n,&m);
	for(int i=1;i<=m;i++){
		scanf("%d %d %d",&read_u,&read_v,&read_w);
		graph[read_u].edge_to.push_back(read_v);
		graph[read_u].edge_w.push_back(read_w);
		graph[read_u].cnt_to++;
		graph[read_v].cnt_from++;
	}
	top_sort();
	for(int i=0;i<n;i++){
		if(top_ans[i]==1){
			p1=i;
		}
		if(top_ans[i]==n){
			pn=i;
		}
	}
	dper[p1]=0;
	for(int i=p1+1;i<=pn;i++){
		for(int j=0;j<graph[i].edge_w.size();j++){
			dper[i]=max(dper[i],graph[i].edge_w[j]+dper[j]);
		}
	}	 
	if(dper[pn]<0){
		printf("-1\n");
	}else{
		printf("%lld\n",dper[pn]);
	}

	return 0;
}
2022/3/13 13:48
加载中...