题意介绍
N只猫比赛,给出M个输赢关系,给出符合这些关系的字典序最小的排名
题意分析
就是求字典序最小的拓扑序列,求出每个点的入度,每次从第一个点开始遍历,找到第一个入度为0的点拿出,并将它到达的各点的入度减一,再次遍历。
通过代码
#include<iostream>
using namespace std;
int p[510][510], in_deg[510];
int n, m,a,b;
void topsort() {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (in_deg[j] == 0) {
in_deg[j]--;
cout << j ;
if (i != n) cout << " ";
else cout << endl;
for (int k = 1; k <= n; k++) {
if (p[j][k] == 1)
in_deg[k]--;
}
}
}
}
}
int main() {
while (cin >> n >> m) {
memset(p, 0, sizeof(p));
memset(in_deg, 0, sizeof(in_deg));
for (int i = 0; i < m; i++) {
cin >> a >> b;
if (p[a][b] == 0) {
p[a][b] = 1;
in_deg[b]++;
}
}
topsort();
}
return 0;
}