hdu 1285 拓扑排序入门题

本文介绍了拓扑排序的基本概念及其实现方法,通过一种广度优先遍历的方式来由偏序确定全序。文章详细解释了如何寻找并删除入度为0的节点,以及如何判断图中是否存在环。

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

这是我的第一道拓扑排序题~AC

拓扑排序实质上是一种广度优先遍历,由偏序确定全序。

首先遍历整个关系,找出入度为0的点 j ,然后删了 j,并且所有与j相邻的点的入度都减一。若最后没有节点剩余则说明拓扑排序成功,若最后还有节点剩余,但是找不出入度

为0的点,说明图中有环,则不可拓扑排序。

附上代码

#include <iostream>
using namespace std;
int map[550][550];
int indegree[550];
int main()
{
 int n,m,a,b;
 while(cin>>n>>m)
 {
  memset(map,0,sizeof(map));
  memset(indegree,0,sizeof(indegree));
  for(int i=0;i<m;i++)
  {
    cin>>a>>b;
    if(!map[a][b])  
    {
     map[a][b]=1;
     indegree[b]++;   
    }
  }
  for(int i=1;i<=n;i++)
  {
    for(int j=1;j<=n;j++)
    {
      if(indegree[j]==0)
      {
        indegree[j]--;
        if(i==n)cout<<j<<endl;
        else cout<<j<<" ";    
        for(int k=1;k<=n;k++)
        {
           if(map[j][k])
                indegree[k]--;
        }
        break;
      }
    }
  }
 }
 return 0;   
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值