现在的位置: 首页 > 综合 > 正文

拓扑排序

2018年02月21日 ⁄ 综合 ⁄ 共 1200字 ⁄ 字号 评论关闭
/*基于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);
}

抱歉!评论已关闭.