#include<iostream>#include<cstring>#include<queue>#include<cstdio>usingnamespacestd;
#define MAX 10005int n, sum, ans;
int into[MAX], head[MAX], money[MAX];
struct Reward
{
int to;
int next;
} edge[2 * MAX];
void addEdge(int u, int v, int tot)
{
edge[tot].to = v;
edge[tot].next = head[u];//上一条以u为起点的边的编号
head[u] = tot;//当前以u为起点的边的位置
into[v]++;//记录入度
}
void Init()
{
for (int i = 1; i <= n; i++)
{
head[i] = -1;
into[i] = 0;
money[i] = 888;
}
sum = ans = 0;
}
void topu()
{
int i, j, l, v;
queue<int>Q;
for (i = 1; i <= n; i++)
if (into[i] == 0)
Q.push(i);
while (!Q.empty())
{
v = Q.front();
sum += money[v];
Q.pop();
ans++;
for (l = head[v]; l != -1; l = edge[l].next) //与队首元素v有关的都枚举一遍,循环遍历
{
if (--into[edge[l].to] == 0)
{
Q.push(edge[l].to);
money[edge[l].to] = money[v] + 1;
}
}
}
}
int main()
{
int m, a, b;
while (scanf("%d%d", &n, &m) != EOF)
{
Init();
for (int i = 0; i < m; i++)
{
scanf("%d%d", &a, &b);
addEdge(b, a, i);
}
topu();
if (ans != n)
sum = -1;
cout << sum << endl;
}
return0;
}
#include<iostream>#include<cstring>#include<queue>#include<cstdio>using namespace std;#define MAX 10005int n, sum, ans;int into[MAX], head[MAX], money[MAX];struct Reward{ int to; int n