/*基于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);
}
拓扑排序
最新推荐文章于 2024-11-12 12:35:30 发布