/* 简单的拓扑排序题!发现~scanf();这样输入不太靠谱,竟然tle!不过,开始没发现超时是这个原因,全心全意去改进了自己拓扑排序的效率去了!=-= 用稀疏矩阵标记的效率的确太低,改成邻接表效率不但提高了很多,而且节约了内存空间!ps:以后还是写成scanf()!=EOF,保险一点! */ 点击打开链接
#include < iostream >
#include < cstring >
#include < queue >
#define N 10005
using namespace std;
const int val = 888;
int x[N][100],d[N],y[N],sum;
int topologicialsort(int n)
{
int i,j,k=0,t=0,c[N];
queue<int> que;
for(i=1;i<=n;i++)
if(d[i]==0) que.push(i);
while(!que.empty())
{
while(!que.empty())
{
c[k++]=que.front();
que.pop();
}
sum+=(val+t)*k;
for(i=0;i<k;i++)
{
for(j=0;j<y[c[i]];j++)
{
if(x[c[i]][j]>=0 && d[x[c[i]][j]]>0)
{
d[x[c[i]][j]]--;
if(d[x[c[i]][j]]==0)
{
que.push(x[c[i]][j]);
x[c[i]][j]=-1;
}
}
}
}
t++;k=0;
}
for(i=1;i<=n;i++)
if(d[i]) return 0;
return 1;
}
int main ()
{
freopen("ts.txt","r",stdin);
int n,m,i,j,a,b,f;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(x,-1,sizeof(x));
memset(y, 0,sizeof(y));
memset(d, 0,sizeof(d));
for(f=sum=i=0;i<m;i++)
{
scanf("%d%d",&a,&b);
for(j=0;j<y[b];j++)//判重
if(x[b][j]==a) continue;
x[b][y[b]++]=a; d[a]++;
}
f=topologicialsort(n);
if(f) printf( "%d\n",sum);
else puts("-1");
}
return 0;
}