原题链接传送门
感谢 @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;
}