http://acm.hdu.edu.cn/showproblem.php?pid=2647
如果队列能弹出的不够n那么就是-1;
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
vector<int>e[20005];
queue<int>q;
int in[20005];
int mon[20005];
void init()
{
memset(mon,0,sizeof(mon));
for(int i=1;i<=n;i++){
e[i].clear();
in[i]=0;
}
while(!q.empty())q.pop();
}
int main()
{
int a,b;
while(~scanf("%d%d",&n,&m)){
init();
while(m--){
scanf("%d%d",&a,&b);
e[b].push_back(a);
in[a]++;
}
int cnt=0,sum=0;
for(int i=1;i<=n;i++){
if(!in[i]){
q.push(i);
mon[i]=888;
}
}
while(!q.empty()){
cnt++;
int p=q.front();q.pop();
sum+=mon[p];
for(int i=0;i<e[p].size();i++){
int y=e[p][i];
in[y]--;
if(in[y]==0){
q.push(y);
mon[y]=mon[p]+1;
}
}
}
if(cnt==n)cout<<sum<<endl;
else cout<<"-1"<<endl;
}
}