/*基于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); }