2 1 1 2 2 2 1 2 2 1
1777 -1
#include <stdio.h>
#include <string.h>
#define MAX 10010
int in[MAX] ;
int head[MAX] , t[MAX];
bool visited[MAX] ;
struct Edge{
int to , next ;
}edge[MAX<<1];
int main()
{
int n , m;
while(~scanf("%d%d",&n,&m))
{
memset(head,-1,sizeof(head)) ;
memset(in,0,sizeof(in)) ;
memset(visited,false,sizeof(visited)) ;
int d = 888 , sum = 0 ;
for(int i = 1 ; i <= m ; ++i)
{
int x, y ;
scanf("%d%d",&x,&y) ;
edge[i].to = x ;
edge[i].next = head[y] ;
head[y] = i ;
in[x] ++ ;
}
bool flag = true ;
int i = n ;
while(i>0)
{
int cnt = 0 , index = -1;
for(int j = 1 ; j <= n ; ++j)
{
if(!visited[j] && in[j] == 0)
{
visited[j] = true ;
sum += d ;
t[cnt++] = j ;
--i ;
}
}
if(cnt == 0)
{
flag = false ;
break ;
}
for(int j = 0 ; j < cnt ; ++j)
{
for(int k = head[t[j]] ; k != -1 ; k = edge[k].next)
{
--in[edge[k].to] ;
}
}
++d ;
}
if(flag)
printf("%d\n",sum) ;
else
puts("-1") ;
}
return 0 ;
}原文地址:http://blog.csdn.net/lionel_d/article/details/44699365