萌新刚学OI -114514秒,球条事/qd
  • 板块P1347 排序
  • 楼主_luanyi_
  • 当前回复9
  • 已保存回复9
  • 发布时间2021/10/21 16:01
  • 上次更新2023/11/4 03:03:40
查看原帖
萌新刚学OI -114514秒,球条事/qd
300313
_luanyi_楼主2021/10/21 16:01

这里是代码
我觉得我的代码清晰易懂不用加注释
30pts 仅A #3 #8 #9 /kk

#include <bits/stdc++.h>
#define forq(i,a,b) for (int i = (a); i <= (b); i++)
#define fornq(i,a,b) for (int i = (a); i < (b); i++)
#define nforq(i,a,b) for (int i = (a); i >= (b); i--)
#define nfornq(i,a,b) for (int i = (a); i > (b); i--)
#define fore(u) for (int i = head[u]; i; i = edge[i].nxt)
using namespace std;
#define int long long
const int maxn = 101;

vector <int> vc[maxn];
int n, in[maxn];
int ans[maxn], cnt;
queue <int> q;
int vis[maxn];
int topo (int nn) {
	memset (in, 0, sizeof in);
	forq (i, 1, 26) fornq (j, 0, vc[i].size ()) in[vc[i][j]]++;
	while (!q.empty ()) q.pop ();
	forq (i, 1, 26) if (vis[i] && !in[i]) q.push (i);
	cnt = 0;
	while (!q.empty ()) {
		int u = q.front (); q.pop ();
		ans[++cnt] = u;
		if (!q.empty ()) return 0;
		fornq (i, 0, vc[u].size ()) {
			int v = vc[u][i];
			if (!(--in[v])) q.push (v);
		}
	}
	if (cnt != nn) return -1;
	return 1;
}
signed main () {
	cin >> n;
	int m;
	cin >> m;
	forq (i, 1, m) {
		string s;
		cin >> s;
		vc[s[0] - 'A' + 1].push_back (s[2] - 'A' + 1);
		vis[s[0] - 'A' + 1] = vis[s[2] - 'A' + 1] = 1;
		int ccnt = 0;
		forq (j, 1, 26) ccnt += vis[j];
		int op = topo (ccnt);
		if (op == -1) cout << "Inconsistency found after "<< i << " relations.", exit (0);
		else if (op == 1 && cnt == n) {
			cout << "Sorted sequence determined after " << i << " relations: ";
			forq (i, 1, cnt) cout << char (ans[i] + 'A' - 1);
			cout << '.';
			exit (0);
		}
	}
	cout << "Sorted sequence cannot be determined.", exit (0);
	return 0;
}
2021/10/21 16:01
加载中...