ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2020-06-20 20:01:55  阅读:268  来源: 互联网

标签:25 结点 1146 int 拓扑 Topological 序列 vector judge


一、技术总结

  1. 首先这一题是关于拓扑排序的,必须明确啥是拓扑排序,也就是对于有向无环图,能够生成拓扑序列;使得该序列中任意两个顶点u、v,如果存在u->v,那么在序列中u一定在v的前面。
  2. 然后这一题是给出一个有向无环图,要我们判断所给的序列是否为拓扑排序。
  3. 无论是判断是拓扑序列还是该图是否为有向无环图,都是要定义这几个变量的,也就是存储图的vector< int > v[1010]领接表,然后还需要一个存储每个结点的入度的数组int indegree[1010]。
  4. 如果是要判断所给序列是否为拓扑排序,设置一个judge初始为1, 就需要遍历序列中的每一个结点,按顺序进行遍历,如果有当前结点的入度不为0,judge = 0,那么说明该序列不是拓扑排序,遍历到该结点后,将该结点所能够到达的所有结点的入度都减一。遍历完后,judge判断是否为1。
  5. 如果是要判断一个图是否为有向无环图,那么可

二、参考代码

#include<iostream>
#include<vector>
using namespace std;
//bool topologicalSort(vector<int> G[], int inDegree[]){
//	return;
//}
int main(){
	int m, n, a, b, c, flag = 0;
	scanf("%d%d", &n, &m);
	//vector<vector<int> > v(n);//用于存储图 
	vector<int> v[1010];
	int inDegree[1010];//记录结点的入度 
	for(int i = 0; i < m; i++){
		scanf("%d%d", &a, &b);
		v[a].push_back(b);
		inDegree[b]++; 
	}
	int k;
	scanf("%d", &k);
	for(int i = 0; i < k; i++){
		int judge = 1;
		vector<int> tin(inDegree, inDegree+n+1);
		for(int j = 0; j < n; j++){
			scanf("%d", &c);
			if(tin[c] != 0) judge = 0;
			//for(int l = 0; l < v[c].size(); l++) tin[v[c][l]]--;
            for (int it : v[c]) tin[it]--;
		} 
		if(judge == 1) continue;
		printf("%s%d", flag == 1 ? " " : "", i);
		flag = 1;
	}
	return 0;
}  

标签:25,结点,1146,int,拓扑,Topological,序列,vector,judge
来源: https://www.cnblogs.com/tsruixi/p/13170177.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有