大意:n个重量分别为1-n的小球,给定一些小球间的重量关系。 在符合重量关系的前提下,先输出编号小的球。
思路:也是一道很简单的拓扑排序,不过要倒着来,注意一下要判重边。
#include <string.h> #include <iostream> using namespace std; int Map[210][210], indegree[210], Ans[210]; int n, m, x, y; int i, j; void Topo() { for(i = n; i >= 1; i--) { for(j = n; j >= 1; j--) { if(indegree[j] == 0) { indegree[j]--; Ans[j] = i; for(int k = 1; k <= n; k++) { if(Map[j][k] == 1) { indegree[k]--; } } break; } } if(j < 1) { break; } } if(i >= 1) cout << "-1" << endl; else { for(i = 1; i <= n; i++) { if(i < n) { cout << Ans[i] << " "; } else { cout << Ans[i] << endl; } } } } void Solve() { int cases; cin >> cases; while(cases--) { memset(Map, 0, sizeof(Map)); memset(indegree, 0, sizeof(indegree)); cin >> n >> m; for(i = 1; i <= m; i++) { cin >> x >> y; if(!Map[y][x]) { Map[y][x] = 1; indegree[x]++; } } Topo(); } } int main() { Solve(); return 0; }