5.7拓扑排序

在这里插入图片描述

#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
vector<int> edge[501];//邻接链表 
queue<int> q;//保存入度为0的节点 
int indegree[501];//节点入度数组 
int main(){
 int n,m;
 while(scanf("%d%d",&n,&m)!=EOF&&n!=0||m!=0){
  for(int i=0;i<n;i++){
   indegree[i]=0;
   edge[i].clear();//初始化入度数组和邻接链表 
  }
  for(int i=0;i<m;i++){
   int a,b;
   scanf("%d%d",&a,&b);//输入边 构成图 
   indegree[b]++; 
   edge[a].push_back(b);
  } 
  int cnt=0;
  while(!q.empty())//清空队列 
   q.pop();   
  for(int i=0;i<n;i++)
   if(indegree[i]==0) q.push(i);//若入度为0,压入队列中 
  while(!q.empty()){
   int nowp=q.front();//读出对头节点编号
   q.pop();//弹出队头元素,即将该节点删除 
   cnt++;//记录能输出的节点个数
   for(int i=0;i<edge[nowp].size();i++){//遍历该结点相邻的结点 
    indegree[edge[nowp][i]]--;//该节点已删除则代表相邻节点入度-1
    if(indegree[edge[nowp][i]]==0)
     q.push(edge[nowp][i]); 
   } 
  }
  if(cnt==n) puts("YES");//节点全部输出,无环
  else puts("NO");//节点未完全输出,剩余节点入度均不为0,有环 
 } 
 return 0;
}

3 2
0 1
1 2
2 2
0 1
1 0
0 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值