题目:取木棍游戏,有一些木棍散乱在一起,每次只能拿最上面的,问能否拿完。
分析:图论,拓扑排序。判断覆盖关系,可以拓扑排序则成立。
题目数据量有点大,需要使用邻接表来存储(vector);
避免计算过程值扫描无用节点,可以使用BFS(queue)。
说明:RE了2次(⊙v⊙)。
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
#define NODE_SIZE 100100
vector<int> edge[NODE_SIZE];
int degree[NODE_SIZE];
int answer[NODE_SIZE];
int main()
{
int n, m, u, v;
while (~scanf("%d%d",&n,&m) && n) {
for (int i = 1; i <= n; ++ i) {
edge[i].clear();
degree[i] = 0;
}
for (int i = 1; i <= m; ++ i) {
scanf("%d%d",&u,&v);
degree[v] ++;
edge[u].push_back(v);
}
queue<int> Q;
for (int i = 1; i <= n; ++ i) {
if (degree[i] == 0) {
Q.push(i);
}
}
int index = 0;
while (!Q.empty()) {
answer[++ index] = Q.front();
Q.pop();
int count = edge[answer[index]].size();
for (int j = 0; j < count; ++ j) {
degree[edge[answer[index]][j]] --;
if (degree[edge[answer[index]][j]] == 0) {
Q.push(edge[answer[index]][j]);
}
}
}
if (index == n) {
for (int i = 1; i <= n; ++ i) {
printf("%d\n",answer[i]);
}
}else {
puts("IMPOSSIBLE");
}
}
return 0;
}