http://acm.hdu.edu.cn/showproblem.php?pid=2647
定义一个数组 来标记 保证每次循环找到的是同一层次的 它们加的数是相同的 用f来表示找到多少个入度为0的点 <n时 有环 输出-1
View Code
1 #include<stdio.h>
2 #include<string.h>
3 struct node
4 {
5 int v,w,next;
6 }men[20001];
7 int first[10001],de[10001],t,kk[10001];
8 void init()
9 {
10 t = 0;
11 memset(first,-1,sizeof(first));
12 }
13 void add(int u,int v)
14 {
15 men[t].v = v;
16 men[t].next = first[u];
17 first[u] = t;
18 t++;
19 }
20 void topo(int n)
21 {
22 int i,j,k,f = 0,o=0;
23 __int64 s = 0,w=888,g;
24 memset(kk,0,sizeof(kk));
25 for(i = 1; i <= n ; i++)
26 {
27 for(j = 1 ; j <= n ;j++)
28 {
29 if(kk[j]==i-1&&de[j]==0)
30 {
31 de[j] = -1;
32 f++;
33 g = w+i-1;//根据层次 来加增量
34 s+=g;
35 for(k = first[j] ; k!=-1 ; k = men[k].next)
36 {
37 de[men[k].v]--;
38 if(de[men[k].v]==0)
39 kk[men[k].v] = i;//层次不一样 下次再循环
40 }
41 }
42 }
43 }
44 if(f<n)
45 printf("-1\n");
46 else
47 printf("%I64d\n",s);
48 }
49 int main()
50 {
51 int i,j,k,n,m,a,b;
52 while(scanf("%d%d", &n,&m)!=EOF)
53 {
54 memset(de,0,sizeof(de));
55 init();
56 for(i = 1; i <= m ; i++)
57 {
58 scanf("%d%d", &a,&b);
59 add(b,a);
60 de[a]++;
61 }
62 topo(n);
63 }
64 return 0;
65 }
来源:https://www.cnblogs.com/shangyu/archive/2012/08/02/2620580.html
