拓扑排序

/*基于bfs的拓扑排序总结:
排序的结果无非三种:关系确定、关系不能确定、出现矛盾
三种关系有优先级的,出现矛盾>关系不能确定>关系确定

如果找到某一步发现当前有大于一个入度为0的顶点,那么关系不能确定
如果找的过程中发现没有入度为0的顶点并且已经访问过的顶点数小于总的顶点数,那么出现环,出现矛盾*/
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<string>
#include<satck>
#include<queue>
using namespace std;
queue<int> Q;
stack<int> S;
int ans[maxn];
void toobfs()
{
	while(!Q.empty())Q.pop();
	memset(ans,0,sizeof(ans));
	int cnt=0;
	for(int i=0;i<n;i++)
		if(ind[i]==0)Q.push(i);
	while(!Q.empty()){
		int tmp=Q.front();
		Q.pop();
		ans[cnt++]=tmp;
		for(int k=head[tmp];~k;k=edge[k].next){
			if(--ind[dege[k].v]==0)Q.push(edge[k].v);
		}
	}
	if(cnt<n)puts("error");
}
void topodfs()
{
	while(!S.empty())S.pop();
	memset(ans,0,sizeof(ans));
	int cnt(0);
	for(int i=0;i<n;i++)
		if(ind[i]==0)S.push(i);
	while(!S.empty()){
		int tmp=S.top();
		S.pop();
		ans[cnt++]=tmp;
		for(int k=head[tmp];~k;k=edge[k].next){
			if(--ind[edge[k].v]==0)S.push(edge[k].v);
		}
	}
	if(cnt<n)puts("error");
}
void ini()
{
	memset(ans,0,sizeof(ans));
	cnt=0;
}
void dfstopo_sort(int v)
{
	S.push(v);
	vis[v]=true;
	for(int k=head[v];~k;k=edge[k].next)
		if(!vis[edge[k].v])dfstopo_sort(edge[k].v);;
	int tmp=S.top();
	S.pop();
	ans[cnt++]=tmp;
}
void dfs()
{
	while(!S.empty())S.pop();
	memset(vis,false,sizeof(vis));
	ini();
	for(int i=1;i<=n;i++)
		if(!vis[i])
			dfstopo_sort(i);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值