1146 Topological Order (25分)/拓扑排序

题目描述

在这里插入图片描述在这里插入图片描述

题目大意

给一个有向图,判断给定序列是否是拓扑序列。

分析

根据给定的序列对拓扑排序的过程进行模拟,如果模拟过程中当前顶点其入度不为0,那么就不是一个拓扑序列。
拓扑排序知识点:拓扑排序

AC代码

#include<iostream>
#include<cstring>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<unordered_set>
#include<unordered_map>
#include<stack>
#include<queue>
#include<cmath>
#include<algorithm>
using namespace std;
vector<int> adj[1001];
int in[1001];
int main() {
#ifdef ONLINE_JUDGE
#else
	freopen("1.txt", "r", stdin);
#endif
	int n, m; cin >> n >> m;
	while (m--) {
		int a, b; scanf("%d%d", &a, &b);
		adj[a].push_back(b);
		in[b]++;
	}
	int k, t, flag=0; cin >> k;
	for (int i = 0; i < k; i++) {
		bool judge = 1;
		vector<int> t_in(in, in + n + 1); //每次重新复制一遍是为了不改变in[]
		for (int j = 0; j < n; j++) {
			scanf("%d", &t);
			if (t_in[t] != 0) judge = 0;
			for (int it : adj[t]) t_in[it]--;
		}
		if (judge == 0) {
			if (flag) printf(" ");
			printf("%d", i);
			flag = 1; //用于标记是否是第一个数
		}
	}
	return 0;
}
发布了103 篇原创文章 · 获赞 9 · 访问量 4701

猜你喜欢

转载自blog.csdn.net/weixin_43590232/article/details/104411416