这里是代码
我觉得我的代码清晰易懂不用加注释
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;
}