奖金【拓扑排序】

原题链接传送门

感谢 @luyifeng @liuzihan大佬的指教

拓扑排序:

我们可以这样来理解:
就是一些子工程需要建立在另一些子工程的基础上,
然后从入度为零的点开始,
把这个点一个一个放进一个序列里,
建立一个线性的数的序列
这些数列有至少1种
(解释很粗糙,别介意);
当且仅当一个有向图为有向无环图(directed acyclic graph,或称DAG)时,才能得到对应于该图的拓扑排序。
按照(wo)这(de)种(tu)方法
直接队列模拟,
在这里插入图片描述

代码:

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int d[11100],dl[11100],t[11001];
int tot,hd[11110];
int n,m,x,y,ans;
struct node
{
	int x,to,next;
}e[21110];
void ljb(int x,int y)
{
	e[++tot].x=x;
	e[tot].to=y;
	e[tot].next=hd[x];
	hd[x]=tot;
}
void bfs()                                             //拓扑排序
{
	queue<int>dl;
	for(int i=1; i<=n; i++)
     if(d[i]==0)
	  {
         dl.push(i);
         t[i]=100;
	  }
	while(!dl.empty())
     {
     	int x1=dl.front();
     	dl.pop();
     	for(int i=hd[x1];i;i=e[i].next)
     	 {
     	 	int y1=e[i].to;
     	 	d[y1]--;
     	 	if(!d[y1])
     	 	  dl.push(y1);
     		t[y1]=max(t[x1]+1,t[y1]);
     	 }
     }
}
int main()
{
	cin>>n>>m;
	for(int i=1; i<=m; i++)
	 {
	 	cin>>x>>y;
	 	ljb(y,x);
	 	d[x]++;
	 }
	bfs();
	int myc=1;
	for(int i=1; i<=n; i++)
	 {
		ans=ans+t[i];
		if(d[i]!=0)                                 //判断是否有环
		  myc=0;
	 }
	if(!myc)
	  cout<<-1;
	else
	  cout<<ans;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值