//输入:n:0-n-1点,m:m条有向边
//输出:是否是DAG
//@author:hairu,wu
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
const int max_n=100;
vector<int> edge[max_n]; //邻接链表
int indegree[max_n];
queue<int> q;//保存入度为0的节点
int main(){
int n,m;
while(cin >>n>> m){
if(n==0 && m==0) break;
//初始化
for(int i=0;i<n;i++){
edge[i].clear();
indegree[i]=0;
}
while(!q.empty()){
q.pop(); //将队列清空
}
//输入
for(int i=0;i<m;i++){
int a,b;
cin >> a >> b;
edge[a].push_back(b);
indegree[b]++;
}
//算法开始
int cnt=0; //记录删去的点的数量
for(int i=0;i<n;i++){
if(indegree[i]==0){
q.push(i);
}
}
while(!q.empty()){
int newP=q.front();
q.pop();
cnt++;
for(int j=0;j<edge[newP].size();j++){
indegree[edge[newP][j]]--;
if(indegree[edge[newP][j]]==0){
q.push(edge[newP][j]);//将新的入度为0的点加入到队列中
}
}
}
if(cnt==n){
cout<<"yes"<<endl;
} else{
cout<<"no"<<endl;
}
}
return 0;
}
判断是否是DAG-利用拓扑排序
最新推荐文章于 2023-11-29 17:51:13 发布