洛谷 P1807 最长路(拓扑排序)

https://www.luogu.com.cn/problem/P1807

题目大意

n个顶点的带权有向无环图,边权可能为负值,求1到n的最长路,无法到达则输出 -1

思路

拓扑排序,直接先将入度为0的入队,定义dis数组,先全部设置成一个极小值,dis[i]i号顶点到1的距离,然后拓扑排序过程中更新dis,若最后dis[n]仍为极小值输出 -1,否则输出dis[n]

代码
#include 
#include 
#include 
#include 
#include 
using namespace std;
struct edge {
	int v;
	int w;
};

const int N = 1505;

int n, m;
int dis[N];
int chu[N], ru[N];
vector <edge> g[N];
queue <int> q;

int main() {
	cin >> n >> m;
	for (int i = 0; i <= n; i++) dis[i] = -100005;
	for (int i = 0; i < m; i++) {
		int u, v, w;
		cin >> u >> v >> w;
		chu[u]++, ru[v]++;
		g[u].push_back((edge){v, w});
	}
	for (int i = 1; i <= n; i++) {
		if (!ru[i]) q.push(i);
	}
	dis[1] = 0;
	while (!q.empty()) {
		int fro = q.front();
		q.pop();
		for (int i = 0; i < g[fro].size(); i++) {
			edge t = g[fro][i];
			ru[t.v]--;
			if (!ru[t.v]) q.push(t.v);
			dis[t.v] = max(dis[t.v], dis[fro] + t.w);
		}
	}
	if (dis[n] == -100005) cout << -1 << endl;
	else cout << dis[n] << endl;
	return 0;
}

你可能感兴趣的:(随笔,code,图论)