#include<cstdio> #include<queue> using namespace std; int indegree[10005]; //结点入度 int node[10005]; int NE,money[10005]; int n,m; struct Edge { int in,next; }edge[20005]; //建立链接表 void Insert(int root,int child) { edge[NE].in=child; edge[NE].next=node[root]; node[root]=NE++; } int TPSort() { int sum=0; int i,count=0; queue<int>Q; for(i=1;i<=n;i++) if(!indegree[i]) Q.push(i); while(!Q.empty()) { int k=Q.front(); Q.pop(); sum+=money[k]; count++; for(i=node[k];i!=-1;i=edge[i].next) { int v=edge[i].in; if(!(--indegree[v])) { Q.push(v); money[v]=money[k]+1; } } } if(count<n) return -1; return sum; } int main() { int i,j; int a,b; while(scanf("%d%d",&n,&m)!=EOF) { NE=0; for(i=1;i<=n;i++) { indegree[i]=0; money[i]=888; node[i]=-1; } for(i=1;i<=m;i++) { scanf("%d%d",&a,&b); indegree[a]++; Insert(b,a); //应该要逆向建边 } printf("%d/n",TPSort()); } return 0; }