hdu2647Reward(拓扑排序)

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 }

 

你可能感兴趣的:(HDU)