一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列 例如,一个有序的数列 A,B,C,D 表示A<B,B<C,C<D。在这道题中,我们将给你一系列形如 A<B 的关系,并要求你判断是否能够根据这些关系确定这个数列的顺序。 输入 第一行有两个正整数 n,m ,n 表示需要排序的元素数量,2≤n≤26,第 1 到 n 个元素将用大写的任意不重复大写字母表示 表示。m 表示将给出的形如 A<B 的关系的数量。 接下来有 m 行,每行有 3 个字符,分别为一个大写字母,一个 < 或者 > 符号,一个大写字母,表示两个元素之间的关系。 输出 若根据前 m 个关系即可确定这 n 个元素的顺序 yyy..y(如 ABC),输出 yyy..yyy (保证关系没有矛盾,样例的数据不可直接复制) 样例输入 4 6 A<B A<C B<C C<D B<D A<B 样例输出 ABCD
时间: 2024-04-22 13:25:00 浏览: 71
C语言实现两个递减数列中寻找某一个数
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
bool topologicalSort(vector<vector<int>>& adjList, vector<int>& inDegree, string& res) {
int n = inDegree.size();
queue<int> q;
for (int i = 0; i < n; ++i) {
if (inDegree[i] == 0) {
q.push(i);
}
}
while (!q.empty()) {
int curr = q.front();
q.pop();
res += ('A' + curr);
for (int neighbor : adjList[curr]) {
inDegree[neighbor]--;
if (inDegree[neighbor] == 0) {
q.push(neighbor);
}
}
}
return res.length() == n;
}
int main() {
int n, m;
cin >> n >> m;
vector<vector<int>> adjList(n);
vector<int> inDegree(n, 0);
for (int i = 0; i < m; ++i) {
char a, b;
string relation;
cin >> a >> relation >> b;
if (relation == "<") {
adjList[a - 'A'].push_back(b - 'A');
inDegree[b - 'A']++;
} else {
adjList[b - 'A'].push_back(a - 'A');
inDegree[a - 'A']++;
}
}
string res;
if (topologicalSort(adjList, inDegree, res)) {
cout << res << endl;
} else {
cout << "impossible" << endl;
}
return 0;
}
阅读全文