#include<stdio.h>
#include<string.h>
#include<stack>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
vector<int>t[10000+5];
queue<int>q;
int main()
{
int n,m,i,j,in[10000+5],sum[10000+5],ans,u,v,p,cnt;
while(~scanf("%d%d",&n,&m))
{
ans=n*888;
for(i=0;i<10000+5;i++)
t[i].clear();
memset(in,0,sizeof(in));
while(!q.empty()) q.pop();
for(i=0;i<m;i++)
{
scanf("%d%d",&u,&v);
u--;v--;
in[u]++;
t[v].push_back(u);
}
for(i=0;i<n;i++)
{
if(!in[i])
{
q.push(i);
sum[i]=888;
}
}
cnt=0;
while(!q.empty())
{
cnt++;
p=q.front();
q.pop();
for(i=0;i<t[p].size();i++)
{
in[t[p][i]]--;
if(in[t[p][i]]==0)
{
q.push(t[p][i]);
sum[t[p][i]]=sum[p]+1;
}
}
}
for(i=0,ans=0;i<n;i++)
{
ans+=sum[i];
}
if(cnt!=n) ans=-1;
printf("%d\n",ans);
}
return 0;
}
hdu 2647 Reward 拓扑排序
最新推荐文章于 2022-03-29 20:48:12 发布