把不等式A<B看成一条从A到B的边
那么所有不等式就可以组合成一张有向无环图
然后只需对每个点bfs,从bfs的第二层开始记录即可
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
int vis[27];
map<int, vector<int>> ans;
map<int, vector<int>> mp;
set<int> from;
void bfs(int sorce) {
memset(vis, 0, sizeof(vis));
vis[sorce] = 1;
queue<int> q;
q.push(sorce);
int cur, t, sz, i, j, len;
t = 0;
while (!q.empty()) {
sz = q.size();
t++;
for (i = 0; i < sz; i++) {
cur = q.front();
q.pop();
if (t > 2)ans[sorce].push_back(cur);
vector<int> to = mp[cur];
len = to.size();
for (j = 0; j < len; j++) {
if (!vis[to[j]]) {
vis[to[j]] = 1;
q.push(to[j]);
}
}
}
}
}
int main() {
int T, m, i, coun, len;
char ch[10];
scanf("%d", &T);
coun = 0;
while (T--) {
scanf("%d", &m);
mp.clear();
ans.clear();
for (i = 1; i <= m; i++) {
scanf("%s", ch);
if (ch[1] == '<') {
mp[ch[0] - 'A'].push_back(ch[2] - 'A');
from.insert(ch[0] - 'A');
} else {
mp[ch[2] - 'A'].push_back(ch[0] - 'A');
from.insert(ch[2] - 'A');
}
}
map<int, vector<int>>::iterator it;
for (it = mp.begin(); it != mp.end(); it++) {
bfs(it->first);
}
printf("Case %d:\n", ++coun);
if (!ans.size())printf("NONE\n");
else {
set<int>::iterator it;
for (it = from.begin(); it != from.end(); it++) {
vector<int> v = ans[*it];
sort(v.begin(), v.end());
len = v.size();
for (i = 0; i < len; i++) {
printf("%c<%c\n", 'A' + *it, 'A' + v[i]);
}
}
}
}
}