#2寄了求大佬帮帮孩子吧
  • 板块P1807 最长路
  • 楼主Hopoyage
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/1/12 11:02
  • 上次更新2024/1/12 18:16:18
查看原帖
#2寄了求大佬帮帮孩子吧
1068985
Hopoyage楼主2024/1/12 11:02
	#include<iostream>
	#include<vector>
	#include<queue>
	using namespace std;
	const int N = 5 * 1e4 + 10;

	struct Edge {
		int to;
		int w;
	};
	vector<Edge> e[N];
	int n, m;
	int indegree[N];
	int outdegree[N];
	long long dis[N];

	void topsort() {	//拓扑排序
		queue<int>q;
		q.push(1);
		dis[1] = 0;

		while (q.size()) {
			int t = q.front();
			q.pop();

			for (int i = 0; i < e[t].size(); i++) {
				int j = e[t][i].to, ww = e[t][i].w;
				indegree[j]--;

				dis[j] = max(dis[t] + ww,dis[j]);

				if (indegree[j] == 0)q.push(j);
			}
		}
	}

	int main() {
		cin >> n >> m;

		for (int i = 0; i < m; i++) {
			int a; Edge ee;
			cin >> a >> ee.to >> ee.w;
			e[a].push_back(ee);

			indegree[ee.to]++;
			outdegree[a]++;
		}

		queue<int>q1;

		//以下为排除除了1以外的入度为零的点
		for (int i = 2; i <= n; i++) {
			if (indegree[i] == 0)q1.push(i);
		}

		while (q1.size()) {
			int t = q1.front();
			q1.pop();

			for (int i = 0; i < e[t].size(); i++) {
				int j = e[t][i].to;
				indegree[j]--;
				if (indegree[j] == 0)q1.push(j);
			}
		}

		topsort();

		if (dis[n] == 0)printf("-1");
		else printf("%d",dis[n]);

		return 0;
	}
2024/1/12 11:02
加载中...