1146 Topological Order 解析

初看题目.妈耶...拓扑排序.只知道手工算。没敲过代码啊啊啊....绝望.jpg..

再仔细看题...发现...emmmm 貌似标记有没有前驱指向当前的点就好了..前驱为0,就OK。否则就不是拓扑序列。

这个貌似叫入度???

这中间闹了一个小插曲,不知道你们会不会遇到。我处理的时候是同步处理的,就是读一个数判定一次,失败就跳出。这一跳出就出问题了。怎么都查不出来怎么回事。算法怎么想都没有问题。后面发现是数据没有读完。大家有问题可以考虑下这个问题。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define MAX 1010

using namespace std;

int N, M, K;

vector 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 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;
	
}

 

你可能感兴趣的:(1146 Topological Order 解析)