复兴提高班第十八课 拓扑排序
2025-10-18 20:32:12
发布于:上海
T1【拓扑排序】摄像头
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e2 + 9;
bool vis[maxn];
int deg[maxn];
vector<int> ve[maxn];
int main() {
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		int x, m;
		cin >> x >> m;
		while (m--) {
			int y;
			cin >> y;
			ve[x].push_back(y);
			deg[y]++;
		}
	}
	queue<int> q;
	for (int i = 1; i <= n; i++) {
		if (deg[i] == 0) {
			vis[i] = 1;
			q.push(i);
		}
	}
	while (q.size()) {
		int r = q.front();
		q.pop();
		for (int i = 0; i < ve[r].size(); i++) {
			int y = ve[r][i];
			if (--deg[y] == 0) {
				q.push(y);
				vis[y] = 1;
			}
		}
	}
	int num = 0;
	for (int i = 1; i <= n; i++) {
		if (!vis[i]) num++;
	}
	if (num) cout << num;
	else cout << "YES";
	return 0;
}
T2【拓扑排序】判环
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 9;
vector<int> ve[maxn];
int deg[maxn];
int main() {
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= m; i++) {
		int u, v;
		cin >> u >> v;
		ve[u].push_back(v);
		deg[v]++;
	}
	priority_queue<int, vector<int>, greater<int> >q;
	for (int i = 1; i <= n; i++) {
		if (deg[i] == 0) q.push(i);
	}
	vector<int> ans;
	while (q.size()) {
		int r = q.top();
		q.pop();
		ans.push_back(r);
		for (int i = 0; i < ve[r].size(); i++) {
			int y = ve[r][i];
			if (--deg[y] == 0)q.push(y);
		}
	}
	if (ans.size() != n) cout << "has circle";
	else {
		for (int i = 0; i < ans.size(); i++) cout << ans[i] << " ";
	}
	return 0;
}
T3【拓扑排序】杂务
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + 9;
int dp[maxn];
vector<int> ve[maxn];
int deg[maxn], times[maxn];
int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> times[i];
		int k;
		cin >> k;
		while (k--) {
			int a;
			cin >> a;
			ve[a].push_back(i);
			deg[i]++;
		}
	}
	queue<int> q;
	for (int i = 1; i <= n; i++) {
		if (deg[i] == 0) {
			q.push(i);
			dp[i] = times[i];
		}
	}
	while (q.size()) {
		int r = q.front();
		q.pop();
		for (int i = 0; i < ve[r].size(); i++) {
			int y = ve[r][i];
			dp[y] = max(dp[y], dp[r] + times[y]);
			if (--deg[y] == 0) q.push(y);
		}
	}
	int ans = 0;
	for (int i = 1; i <= n; i++) ans = max(ans, dp[i]);
	cout << ans;
	return 0;
}
T4【拓扑排序】最大食物链计数
#include<bits/stdc++.h>
using namespace std;
const int MOD = 80112002;
const int maxn = 2e3 + 9;
int dp[maxn];
vector<int> ve[maxn];
int deg[maxn];
bool vis[maxn];
int main() {
	int n, m;
	cin >> n >> m;
	for (int i = 0; i < m; i++) {
		int A, B;
		cin >> A >> B;
		ve[A].push_back(B);
		deg[B]++;
		vis[A] = 1;
	}
	queue<int> q;
	for (int i = 1; i <= n; i++) {
		if (deg[i] == 0) {
			dp[i] = 1;
			q.push(i);
		}
	}
	while (q.size()) {
		int r = q.front();
		q.pop();
		for (int i = 0; i < ve[r].size(); i++) {
			int y = ve[r][i];
			dp[y] += dp[r];
			dp[y] %= MOD;
			if (--deg[y] == 0) q.push(y);
		}
	}
	int ans = 0;
	for (int i = 1; i <= n; i++) {
		if (!vis[i]) {
			ans += dp[i];
			ans %= MOD;
		}
	}
	cout << ans;
	return 0;
}
T5【拓扑排序】时间线
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 9;
int S[maxn], deg[maxn];
struct node {
	int v, w;
};
vector<node> ve[maxn];
int dp[maxn];
int main() {
	int N, M, C;
	cin >> N >> M >> C;
	for (int i = 1; i <= N; i++) cin >> S[i];
	for (int i = 0; i < C; i++) {
		int a, b, x;
		cin >> a >> b >> x;
		ve[a].push_back({ b,x });
		deg[b]++;
	}
	queue<int> q;
	for (int i = 1; i <= N; i++) {
		dp[i] = S[i];
		if (deg[i] == 0) q.push(i);
	}
	while (q.size()) {
		int r = q.front();
		q.pop();
		for (int i = 0; i < ve[r].size(); i++) {
			int y = ve[r][i].v, w = ve[r][i].w;
			dp[y] = max(dp[y], dp[r] + w);
			if (--deg[y] == 0) q.push(y);
		}
	}
	for (int i = 1; i <= N; i++) cout << dp[i] << '\n';
	return 0;
}
这里空空如也









有帮助,赞一个