zoukankan      html  css  js  c++  java
  • A 1146 Topological Order (25分)(拓扑排序)

    一、技术总结

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

    判断是否为有向无环图

    • 首先设立一个是队列q终于存储入度为0的结点,同时设置变量num初始化为0,用于记录加入队列中结点的数量;
    • 然后弹出队首结点, 将队首结点能够到达的所有结点的入度都减一,如果这时有结点的入度变为0,那么则将该结点加入队列;
    • 记得将弹出的结点能够到达的边清除,然后num++
    • 最后判断,如果num == n即图结点的个数,那么为有向无环图
    • 如果是要判断一个图是否为有向无环图,那么可使用以下代码:
    vector<int> G[MAXV];
    int n, m, in[MAXV];
    
    bool topologicalSort(){
    	int num = 0//用于记录进入结点的次数是否为结点的个数
    	queue<int> q;
    	for(int i = 0; i < n; i++){
    		if(in[i] == 0){
    			q.push(i);
    		}
    	}	
    	while(!q.empty()){
    		int u = q.front();
    		q.pop();
    		for(int i = 0; i < G[u].size(); i++){
    			int v = G[u][i];
    			in[v]--;
    			if(in[v] == 0){
    				q.push(v);
    			}
    		}
                    G[u].clear();
    		num++;
    	}
    	if(num == n) return true;
    	else return false;
    }
    

    二、参考代码

    #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;
    }  
    
    作者:睿晞
    身处这个阶段的时候,一定要好好珍惜,这是我们唯一能做的,求学,钻研,为人,处事,交友……无一不是如此。
    劝君莫惜金缕衣,劝君惜取少年时。花开堪折直须折,莫待无花空折枝。
    曾有一个业界大牛说过这样一段话,送给大家:   “华人在计算机视觉领域的研究水平越来越高,这是非常振奋人心的事。我们中国错过了工业革命,错过了电气革命,信息革命也只是跟随状态。但人工智能的革命,我们跟世界上的领先国家是并肩往前跑的。能身处这个时代浪潮之中,做一番伟大的事业,经常激动的夜不能寐。”
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    BadUSB 利用
    java 将函数作为参数传递
    odoo12 修行提升篇之 常用的高阶函数 (二)
    odoo12 修行提升篇之 异步定时任务 (一)
    odoo12 修行基础篇之 利用kanban做分析 点击跳转分析模型列表 (九)
    odoo12 修行基础篇之 kanban (八)
    odoo12 修行基础篇之 记录批处理 (七)
    odoo12 修行基础篇之 列表的筛选和分组 (六)
    odoo12 修行基础篇之 添加记录编码 (五)
    odoo12 修行基础篇之 添加工作流和操作记录 (四)
  • 原文地址:https://www.cnblogs.com/tsruixi/p/13170177.html
Copyright © 2011-2022 走看看