2647 Reward

http://acm.hdu.edu.cn/showproblem.php?pid=2647  Reward

使用拓扑排序判断有无环

 

  
  
  
  
  1. #include<stdio.h>  
  2. #include<stdlib.h>  
  3. #define N 10005  
  4. struct arc_node{    
  5.     int adjvex;  
  6.     struct arc_node *next;  
  7. };  
  8. struct vex_node{  
  9.     int indegree;  
  10.     int num;  
  11.     struct arc_node *first_arc;  
  12. };  
  13. struct vex_node vertex[N];  
  14. int queue[N];  
  15.  
  16. int init(int n)  
  17. {  
  18.     int i;  
  19.     for (i = 1; i <= n; i++)  
  20.     {  
  21.         vertex[i].indegree = 0;  
  22.         vertex[i].num = 0;  
  23.         vertex[i].first_arc = NULL;  
  24.     }  
  25.     return 1;  
  26. }  
  27.  
  28. int calc(int n)  
  29. {  
  30.     int begin, end;  
  31.     int i, v;  
  32.     struct arc_node *p;  
  33.     int flag;  
  34.  
  35.     begin = 0;  
  36.     end = 0;  
  37.     for (i = 1; i <= n; i++)  
  38.     {  
  39.         if (vertex[i].indegree == 0)  
  40.         {  
  41.             queue[end++] = i;   //每个顶点最多入队一次  
  42.         }  
  43.     }  
  44.     while (begin < end)  
  45.     {  
  46.         v = queue[begin++];  
  47.         p = vertex[v].first_arc;  
  48.         while (p)  
  49.         {  
  50.             vertex[p->adjvex].indegree--;  
  51.             if (vertex[p->adjvex].indegree == 0)   //判断入度是否为0,为0就入队  
  52.                 queue[end++] = p->adjvex;  
  53.  
  54.             if (vertex[p->adjvex].num < vertex[v].num + 1)  
  55.                 vertex[p->adjvex].num = vertex[v].num + 1;  
  56.  
  57.             p = p->next;  
  58.         }  
  59.     }  
  60.  
  61.     flag = 0;  
  62.     for (i = 1; i <= n; i++)  
  63.     {  
  64.         if (vertex[i].indegree != 0)  
  65.             flag = 1;  //flag等于1表示有环  
  66.     }  
  67.     return flag;  
  68. }  
  69.  
  70.  
  71. void main()  
  72. {  
  73.     int m, n;  
  74.     int a, b;  
  75.     struct arc_node *p;  
  76.     int sum;   
  77.     int i, tag;  
  78.  
  79.   // freopen("input.txt", "r", stdin);  
  80.     while (scanf("%d%d", &n, &m) != EOF)  
  81.     {  
  82.         init(n);  
  83.         for (i = 0; i < m; i++)  
  84.         {  
  85.             scanf("%d%d", &a, &b);  
  86.             p = vertex[b].first_arc;  
  87.             tag = 0;  
  88.             while (p)  
  89.             {  
  90.                 if (p->adjvex == a)  
  91.                 {  
  92.                     tag = 1;  
  93.                     break;  
  94.                 }  
  95.                 p = p->next;  
  96.             }  
  97.             if (tag == 1)  
  98.                 continue;  
  99.  
  100.             p = (struct arc_node *)malloc(sizeof(struct arc_node));  
  101.             if (!p)  
  102.                 exit(0);  
  103.             p->adjvex = a;  
  104.             p->next = vertex[b].first_arc;  
  105.             vertex[b].first_arc = p;  
  106.             vertex[a].indegree++;  
  107.         }  
  108.  
  109.         if (calc(n) == 1)  
  110.         {  
  111.             printf("%d\n", -1);  
  112.         }  
  113.         else 
  114.         {  
  115.             sum = n * 888;  
  116.             for (i = 1; i <= n; i++)  
  117.             {  
  118.                 sum +=vertex[i].num;  
  119.             }  
  120.             printf("%d\n", sum);  
  121.         }  
  122.     }  
  123. }  

 

你可能感兴趣的:(职场,ACM,休闲,Reward,2647)