• 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;
    }  
    
    作者:睿晞
    身处这个阶段的时候,一定要好好珍惜,这是我们唯一能做的,求学,钻研,为人,处事,交友……无一不是如此。
    劝君莫惜金缕衣,劝君惜取少年时。花开堪折直须折,莫待无花空折枝。
    曾有一个业界大牛说过这样一段话,送给大家:   “华人在计算机视觉领域的研究水平越来越高,这是非常振奋人心的事。我们中国错过了工业革命,错过了电气革命,信息革命也只是跟随状态。但人工智能的革命,我们跟世界上的领先国家是并肩往前跑的。能身处这个时代浪潮之中,做一番伟大的事业,经常激动的夜不能寐。”
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    centos8 安装postresql12
    vs code 开启远程调试步骤
    node 版本管理器 nvs
    Vue I18n Vue.js 的国际化插件+elementUI的使用
    c#结构
    下拉菜单
    使用Convert 类和Parse方法将字符串转换为数值类型
    c# try..... catch
    c#迭代算法
    网页兼容各种浏览器
  • 原文地址:https://www.cnblogs.com/tsruixi/p/13170177.html
Copyright © 2020-2023  润新知