ICode9

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

6.4.3 拓扑排序

2022-01-24 19:00:17  阅读:155  来源: 互联网

标签:排序 mat int 拓扑 6.4 cntr maxl include


好吧,笔者开单章开上瘾了,话不多说,先来一个拓扑排序,笔者最初自己写的时候并没有使用拓扑排序吧

Ordering_Tasks题解

点击查看笔者代码
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;

const int maxl = 100+5;
int cntr[maxl], cntc[maxl], mat[maxl][maxl];
bool isOut[maxl];

bool check(int (&a)[maxl], int& n){
  for(int i = 1; i <= n; i++) 
    if(a[i]) return true;
  return false;
}

void del(int& val, int& n) {
  cntr[val] = cntc[val] = 0;
  for(int i = 1; i <= n; i++) {
  	if(mat[val][i]) {
  	  mat[val][i] = 0;
	  cntc[i]--;	
	} 
	if(mat[i][val]) {
	  mat[i][val] = 0;
	  cntr[i]--;
	}
  }	
}

int main() {
//  freopen("test.in", "r", stdin);
//  freopen("test.out", "w", stdout);
  int n, m;
  while(scanf("%d%d", &n, &m) == 2 && (n||m)) {
  	memset(mat, 0, sizeof(mat));
  	memset(isOut, 0, sizeof(isOut));
  	memset(cntr, 0, sizeof(cntr));
  	memset(cntr, 0, sizeof(cntc));
	int x, y, flag = 0;
  	for(int i = 0; i < m; i++) {
  	  cin >> x >> y;
	  if(!mat[x][y]) {
	  	mat[x][y] = 1;
	  	cntr[x]++;
	    cntc[y]++;
	  }	
	}
	vector<int> output;
    while(check(cntr, n)) {
      output.clear();
      for(int i = 1; i <= n; i++) 
        if(cntr[i] && !cntc[i]) output.push_back(i);
      for(int i = 0; i < output.size(); i++) {
        isOut[output[i]] = 1;
		if(flag) cout << " ";
		if(!flag) flag = 1;
		cout << output[i];
		del(output[i], n);	
	  }
	}
	for(int i = 1; i <= n; i++) 
	  if(!isOut[i]) {
	  	if(flag) cout << " ";
	  	if(!flag) flag = 1;
	  	cout << i;
	  } 	
	  
	cout << endl;
  }
  return 0;
}

很暴力的一种simulate思想,这题的难点不是很多,笔者的思想类似一个大擂台,没有出现的数字就是最大的,后面随便排就好了,而出现的数字,不断地找到最小的数字,淘汰掉就可以了,是的,优胜劣汰,又是一种新的递归思想,不过,需要注意的是本题的一大坑点,m可以为0,这题不能以n && m作为终止条件,而是需要考虑到m==0的特殊情况,呜呜,我的first blood

标签:排序,mat,int,拓扑,6.4,cntr,maxl,include
来源: https://www.cnblogs.com/FlnButFly/p/15840578.html

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

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

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

ICode9版权所有