30 pts 求调!
查看原帖
30 pts 求调!
878013
_Supernova楼主2024/8/15 13:38
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
typedef pair <int, int> pii;
typedef long double ld;
const int N = 2e3 + 3;
int n, m, k[N];
vector <int> to[N];
int in[N], o[N];
queue <int> q;
vector <int> ans;
void Tp_sort(void) {
	int tim = 0;
	for (int i = 1; i <= n; ++i) {
		if (!in[i]) {
			q.push(i);
		}
	}
	while (!q.empty()) {
		++tim;
		for (int i = 0; i < q.size(); ++i) {
			int u = q.front();
			if (tim >= k[u]) {
				q.pop();
				ans.push_back(u);
				for (int v : to[u]) {
					--in[v];
					if (!in[v]) q.push(v);
				}
				break;
			}
			q.pop();
			q.push(u);
		}
	}
	reverse(ans.begin(), ans.end());
	for (int i : ans) cout << i << ' ';
	cout << '\n'; 
	return ;
}
void ex_Tp_sort(int s) {
	for (int i = 1; i <= n; ++i) {
		if (!in[i]) {
			q.push(i);
		}
	}
	int tim = 0;
	while (!q.empty()) {
		++tim;
		vector <int> vec;
		for (int i = 0; i < q.size(); ++i) {
			vec.push_back(q.front());
			q.push(q.front());
			q.pop();
		} 
		auto it = find(vec.begin(), vec.end(), s);
		if (it == vec.end()) {
			for (int i = 0; i < q.size(); ++i) {
				int u = q.front();
				if (tim >= k[u]) {
					q.pop();
					for (int v : to[u]) {
						--in[v];
						if (!in[v]) q.push(v);
					}
					break;
				}
				q.pop();
				q.push(u);
			} 
		}
		else {
			bool flag = false;
			int idx = 0;
			for (int i = 0; i < q.size(); ++i) {
				int u = q.front();
				if (u == s) {
					q.pop();
					q.push(u);
					continue;
				}
				if (tim < k[u]) continue;
				flag = true;
				idx = u;
				break;
			}
			if (!flag) {
				cout << n - tim + 1 << ' ';
				break;
			}
			for (int i = 0; i < q.size(); ++i) {
				int u = q.front();
				if (u != idx) {
					q.pop();
					q.push(u);
					continue;
				}
				q.pop();
				for (int v : to[u]) {
					--in[v];
					if (!in[v]) q.push(v);
				}
				break;
			}
		}
	}
	return ;
}
int main(void) {
	cin.tie(0), cout.tie(0);
	cin >> n >> m;
	for (int i = 1; i <= n; ++i) {
		cin >> k[i];
		k[i] = n - k[i] + 1;
	}
	for (int i = 1, a, b; i <= m; ++i) {
		cin >> a >> b;
		to[b].push_back(a);
		++in[a];
	}
	memcpy(o, in, sizeof in);
	Tp_sort();
	for (int i = 1; i <= n; ++i) {
		memcpy(in, o, sizeof o);
		while (!q.empty()) q.pop();
		ex_Tp_sort(i);
	}
	return 0;
}
2024/8/15 13:38
加载中...