#2WA求调
查看原帖
#2WA求调
1106969
Riptide65536楼主2024/11/21 23:29
#include <bits/stdc++.h>
using namespace std;
#define MAX 1505
#define INF 0x3F3F3F3F

int n, m;
vector<int> edges[MAX];
vector<int> deg[MAX];
int indeg[MAX];
int longest[MAX];

int TropSort(){
	queue<int> st;
	for(int i=2; i<=n; i++){
		// 带负权需要把2以上点初始为-INF 
		longest[n] = -INF;
		// 2号以上点的松弛处理 
		if(indeg[i] == 0) st.push(i);
	}
	// 需要预处理:非1的入度为0点既不能不管,又不能加入栈
	// 不管则延伸出来的点入度总大于0,终点无法到达
	// 管了则会出错(因为本来那些点无法到达) 
	// 需要额外的松弛操作“放弃”那些点, 从而使得算法顺利进行
	
	while(!st.empty()){
		int p = st.front(); st.pop();
		for(auto &q: edges[p]){
			indeg[q]--;
			if(indeg[q] == 0) st.push(q);
		}
	}
	
	// 1号点的处理
	st.push(1);
	while(!st.empty()){
		int p = st.front(); st.pop();
		for(int i=0; i<edges[p].size(); i++){
			longest[edges[p][i]] = max(longest[edges[p][i]], 
			longest[p] + deg[p][i]);
			indeg[edges[p][i]]--;
			if(indeg[edges[p][i]] == 0) st.push(edges[p][i]);
		}
	}
	
	if(longest[n] == -INF) return -1;
	else return longest[n];
}

int main(){
	cin >> n >> m;
	int u, v, w;
	for(int i=0; i<m; i++){
		cin >> u >> v >> w;
		edges[u].push_back(v);
		deg[u].push_back(w);
		indeg[v]++;
	}
	
	int ans = TropSort();
	cout << ans;
	 
	return 0;
}
2024/11/21 23:29
加载中...