拓扑排序-判定是否为有向无环图
#include<stdio.h>
#include<queue>
#include<vector>
using namespace std;
vector<int> edge[501];//邻接链表,因为边不存在权值,只需保存与其邻接的节点编号
queue<int> Q;
int main(){
int indegree[501];//统计每个节点的入度
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){//n为节点数,m为输入信息的行数
if(n==0&&m==0) break;
for(int i=0;i<n;i++){ //初始化入度为0,并清空邻接表
indegree[i]=0;
edge[i].clear();
}
while(m--){ //输入点与点间关系,统计各个点入度
int a,b;
scanf("%d%d",&a,&b);
indegree[b]++;
edge[a].push_back(b); //将b加入a的邻接表
}
while(Q.empty()==false) Q.pop(); //若队列非空,弹出,清空队列
for(int i=0;i<n;i++)
if(indegree[i]==0) Q.push(i); //将入度为0的点入队
int count=0;
while(!Q.empty()){
int nowP=Q.front();
Q.pop();
count++;
for(int j=0;j<edge[nowP].size();j++){//若入度为0将其邻接链表各节点入度减一
int temp=edge[nowP][j];
indegree[temp]--;
if(indegree[temp]==0)
Q.push(temp); //入度为0的点入队
}
}
if(count==n) printf("YES\n");//若最后弹出的点数与初始数目相同,则无环
else printf("NO\n");
}
return 0;
}
此图为运行结果