拓扑排序问题(判断有向图是否有环)——C++实现

本文深入探讨了拓扑排序算法的实现,通过邻接表表示的有向无环图(DAG),使用队列存储入度为0的节点进行遍历,判断图是否存在环。适用于课程安排、任务依赖关系等场景的分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <bits/stdc++.h>
using namespace std;
const int MAXN=500;
vector<int> graph[MAXN];//以邻接表(向量形式)组成的图
int inDegree[MAXN];//每个点的入度
bool TopologicalSort(int n){    //拓扑排序过程
   queue<int> node;//存入度为0的点
   for(int i=0;i<n;i++){
    if(inDegree[i]==0){
        node.push(i);
    }
   }
   int number=0;
   while(!node.empty()){  
    int u=node.front();
    node.pop();
    number++;
    for(int i=0;i<graph[u].size();i++){
        int v=graph[u][i];//获取与节点邻接的边
        inDegree[v]--;
        if(inDegree[v]==0){//若入度为0,则存入队列
            node.push(v);
        }
    }
   }
   return n==number;//若最后还有入度不为0的点,则说明图有环(若二者相等则无环)
}
int main(){
   int n,m;//n是节点数,m是边数
   while(scanf("%d%d",&n,&m)!=EOF){
    if(n==0){
        break;
    }
    memset(graph,0,sizeof(graph));//初始化图
    memset(inDegree,0,sizeof(inDegree));//初始化各点入度
    while(m--){
        int from,to;//边的起点和终点
        scanf("%d%d",&from,&to);
        graph[from].push_back(to);
        inDegree[to]++;
    }
    if(TopologicalSort(n)){
        printf("YES\n");
    } else{
        printf("NO\n");
    }
   }
   return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值