CH6_20.C
上传用户:lgb298
上传日期:2013-03-22
资源大小:1025k
文件大小:3k
源码类别:

软件工程

开发平台:

C/C++

  1. #include <stdio.h>
  2. #include <alloc.h>
  3. #define M 20
  4. #define MAX 100
  5. typedef struct node
  6. {   int vex;
  7.     int length;
  8.     struct node *next;
  9. }JD;
  10. typedef struct tnode
  11. {   int vexdata;
  12.     int in;
  13.     struct node *link;
  14. }TD;
  15. int loc_vertex(TD g[],int vex,int n)
  16. {   int i,j;
  17.     for(i=1;i<=n;i++)
  18.        if(g[i].vexdata==vex)
  19.    return(i);
  20.     return(0);
  21. }
  22. int crt_linklist(TD g[])
  23. {   int n,e,i,j,k,vt,vh,length;
  24.     JD *p;
  25.     printf("Input and the number of node,arc:");
  26.     scanf("%d,%d",&n,&e);
  27.     for(i=1;i<=n;i++)
  28.     {  printf("g[%d].vexdata=",i);
  29.        scanf("%d",&g[i].vexdata);
  30.        g[i].in=0;
  31.        g[i].link=NULL;
  32.     }
  33.     for(k=1;k<=e;k++)
  34.     {   printf("Vt,Vh,length:");
  35. scanf("%d,%d,%d",&vt,&vh,&length);
  36. i=loc_vertex(g,vt,n);
  37. j=loc_vertex(g,vh,n);
  38. p=(JD *)malloc(sizeof(JD));
  39. p->vex=j;
  40. p->length=length;
  41. p->next=g[i].link;
  42. g[i].link=p;
  43.     }
  44.     return(n);
  45. }
  46. void cal_in(TD g[],int n)
  47. {  int i,k;
  48.    JD *p;
  49.    for(i=1;i<=n;i++)
  50.    {  p=g[i].link;
  51.       while(p!=NULL)
  52.       {  k=p->vex;
  53.  g[k].in++;
  54.  p=p->next;
  55.       }
  56.    }
  57. }
  58. int dut(TD g[],int vt,int vh)
  59. {  JD *p;
  60.    p=g[vt].link;
  61.    while(p!=NULL)
  62.    {   if(p->vex==vh)
  63.    return(p->length);
  64.        else
  65.   p=p->next;
  66.    }
  67.    return(MAX);
  68. }
  69. int toporder(TD g[],int n,int ve[],int top2[],int *t2)
  70. {  int top1[M];
  71.    int m,k,j,top;
  72.    JD *p;
  73.    top=0; m=0;
  74.    for(j=1;j<=n;j++)
  75.       ve[j]=0;
  76.    for(j=1;j<=n;j++)
  77.      if(g[j].in==0)
  78.      {  top1[top]=j;
  79. top++;
  80.      }
  81.    while(top>0)
  82.    {  j=top1[--top];
  83.       top2[*t2]=j;
  84.       (*t2)++;
  85.       m++;
  86.       p=g[j].link;
  87.       while(p!=NULL)
  88.       {  k=p->vex;
  89.  g[k].in--;
  90.  if(g[k].in==0)
  91.     top1[top++]=k;
  92.  if(ve[j]+dut(g,j,k)>ve[k])
  93.     ve[k]=ve[j]+dut(g,j,k);
  94.  p=p->next;
  95.       }
  96.    }
  97.    if(m<n)  return(0);
  98.    else     return(1);
  99. }
  100. void critical_path(TD g[],int n)
  101. {   int i,t2=0,j,k,ee,el;
  102.     char tag;
  103.     JD *p;
  104.     int ve[M],vl[M],top2[M];
  105.     i=toporder(g,n,ve,top2,&t2);
  106.     if(!i)
  107.        printf("Has a cycle!");
  108.     else
  109.     {  for(i=1;i<=n;i++)
  110.   vl[i]=MAX;
  111.        vl[n]=ve[n];
  112.        while(t2>0)
  113.        {  j=top2[--t2];
  114.   p=g[j].link;
  115.   while(p!=NULL)
  116.   {  k=p->vex;
  117.      if(vl[k]-dut(g,j,k)<vl[j])
  118.   vl[j]=vl[k]-dut(g,j,k);
  119.      p=p->next;
  120.   }
  121.        }
  122.        for(j=1;j<=n;j++)
  123.        {  p=g[j].link;
  124.   while(p!=NULL)
  125.   {  k=p->vex;
  126.      ee=ve[j];
  127.      el=vl[k]-dut(g,j,k);
  128.      if(ee==el)
  129.  tag='*';
  130.      else
  131.  tag=' ';
  132.      printf("Vt=%d,Vh=%d,Length=%d,ee=%d,el=%d,%cn",j,k,dut(g,j,k),ee,el,tag);
  133.      p=p->next;
  134.   }
  135.        }
  136.     }
  137. }
  138. void main()
  139. {  int n;
  140.    TD g[M];
  141.    n=crt_linklist(g);
  142.    cal_in(g,n);
  143.    critical_path(g,n);
  144. }