toposort_bfs
/*
思想:选择入度为0的顶点输出,并且删除该顶点和图中所有出边循环结束后,如果输出
顶点个数小于图中顶点个数,则说明存在有向环。
时间/空间复杂度:O(n+m)/O(n*n)
应用:判有向环、topo排序
例题:FZU1924
*/
#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
int n,m,t;
queue<int>Q;
const int maxn=1100;
int G[maxn][maxn];
int indegree[maxn];
int topo[maxn];
bool toposort_bfs(){
int num_v=0; //记录入队顶点的个数
t=0; //topo顺序下标
while(!Q.empty()){
Q.pop();
}
for(int i=0;i<n;i++){
if(indegree[i]==0){ //将入度为0的顶点入队
Q.push(i);
}
}
while(!Q.empty()){
int u=Q.front();
Q.pop();
topo[t++]=u; //将排好顺序的顶点放入数组
num_v++; //记录入度为0的顶点个数
for(int i=0;i<n;i++){
if(G[u][i]){//如果有弧
//将跟弧尾i的入度减一
indegree[i]--;
if(indegree[i]==0)
Q.push(i);
}
}
}
if(num_v==n) //可以形成拓扑顺序
return true;
else //不能
return false;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++){
int u,v;
scanf("%d%d",&u,&v);
G[u][v]=1; //有向图
indegree[v]++; //记录入度
}
toposort_bfs();
for(int i=0;i<n;i++)
printf("%d\n",topo[i]);
return 0;
}
/*
7 8
0 2
0 1
1 2
1 5
5 6
2 3
2 4
3 4
*/
学学学 练练练 刷刷刷

浙公网安备 33010602011771号