初看题目.妈耶...拓扑排序.只知道手工算。没敲过代码啊啊啊....绝望.jpg..
再仔细看题...发现...emmmm 貌似标记有没有前驱指向当前的点就好了..前驱为0,就OK。否则就不是拓扑序列。
这个貌似叫入度???
这中间闹了一个小插曲,不知道你们会不会遇到。我处理的时候是同步处理的,就是读一个数判定一次,失败就跳出。这一跳出就出问题了。怎么都查不出来怎么回事。算法怎么想都没有问题。后面发现是数据没有读完。大家有问题可以考虑下这个问题。
#include <iostream>
#include <string>
#include <string.h>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <algorithm>
#define MAX 1010
using namespace std;
int N, M, K;
vector<int> m[MAX];
int hasPre[MAX];
bool isTopological() {
int tempPre[MAX];
for (int i = 0; i < MAX; i++) {
tempPre[i] = hasPre[i];
}
int num;
for (int j = 0; j < N; j++) {
scanf("%d", &num);
if (tempPre[num] != 0) {
while (++j < N) {//删除多余的数字
scanf("%d", &num);
}
return false;
}
else {
for (int i = 0; i < m[num].size(); i++) {
int u = m[num][i];
tempPre[u]--;
}
}
}
return true;
}
int main() {
scanf("%d %d", &N, &M);
memset(hasPre, 0, sizeof(hasPre));
int u, v;
for (int i = 0; i < M; i++) {
scanf("%d %d", &u, &v);//u->v
m[u].push_back(v);
hasPre[v]++;
}
scanf("%d", &K);
vector<int> list;
for (int i = 0; i < K; i++) {
if (!isTopological()) {
list.push_back(i);
}
}
for (int i = 0; i < list.size(); i++) {
if (i == 0) {
printf("%d", list[i]);
}
else {
printf(" %d", list[i]);
}
}
return 0;
}