拓补排序板子(卡恩算法/

Kahn算法

(判环,输出拓补序列)

时间复杂度O(n+e)

int n,m;
vector<int>e[105];//邻接表
vector<int>tp;//拓扑数组
int din[105];//入度表
bool toposort(){
	queue<int>q;
	rep(i,1,n) if(din[i]==0)q.push(i);
	while(!q.empty()){
		int x=q.front();q.pop();
		tp.pb(x);
		for(int i=0;i<e[x].size();i++){
			if(--din[e[x][i]]==0)q.push(e[x][i]);
		}
	}
	return tp.size()==n;
}

dfs染色法

vector<int>e[n];
vector<int>tp;
int c[n];//1 代表已经搜到  0 代表未遍历 -1代表正在遍历 
bool dfs(int x){
	c[x]=-1;
	for(auto y:e[x]){
		if(c[y]==-1)return false;
		if(c[y]==0){
		if(!dfs(y))return false;
		}
	}
	c[x]=1;
	tp.pb(x);
	return true;
}

bool toposort(){
	memset(c,0,sizeof(c));
	rep(i,1,n){
		if(c[x]==0){
			if(!dfs(x))return false;
		}
	}
	reverse(tp.begin(),tp.end());
	return true;
}
posted @   Marinaco  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示