鱼C论坛

 找回密码
 立即注册
查看: 2456|回复: 0

关于图的关键路径

[复制链接]
发表于 2011-11-22 20:33:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我写了一个计算图的关键路径的程序,可是出来的最早和最晚老是一样的,关键活动也不对,高手帮忙看看那里错了
  1. #include "iostream.h"
  2. #include "stdlib.h"
  3. #include "malloc.h"
  4. #define MAX 30

  5. typedef struct node
  6. {
  7.         int vex;
  8.         struct node *next;
  9. }edgenode;

  10. typedef struct vnode
  11. {
  12.         int id;
  13.         struct node *link;
  14. }vexnode;

  15. typedef struct nodel
  16. {
  17.         int adgvex;
  18.         int dut;
  19.         struct nodel *next;
  20. }edgenodel;

  21. typedef struct vnodel
  22. {
  23.         int vertex;
  24.         int id;
  25.         struct nodel *link;
  26. }vexnodel;

  27. int na;
  28. int creatAOE(vexnodel dig[]);
  29. int creatAOV(vexnode dig[]);
  30. void toposort(vexnode dig[],int n);
  31. void criticalpath(vexnodel dig[],int n);

  32. void main()
  33. {
  34.         vexnodel dig[MAX];
  35.         vexnode dig2[MAX];
  36.         int n=0;
  37.         int cord=1;
  38.         while (1)
  39.         {
  40.                 cout<<"     主菜单     "<<endl;
  41.                 cout<<"1.建立AOV邻接链表"<<endl;
  42.                 cout<<"2.建立AOE邻接链表"<<endl;
  43.                 cout<<"3.拓扑排序"<<endl;
  44.                 cout<<"4.求关键路径"<<endl;
  45.                 cout<<"输入代码选择:(1-4),0表示结束"<<endl;
  46.                 cin>>cord;
  47.                 switch(cord)
  48.                 {
  49.                 case 1:
  50.                         n=creatAOV(dig2);
  51.                         break;
  52.                 case 2:       
  53.                         cout<<"input Arcs:";
  54.                         cin>>na;
  55.                         n=creatAOE(dig);
  56.                         break;
  57.                 case 3:
  58.                         toposort(dig2,n);
  59.                         break;
  60.                 case 4:
  61.                         criticalpath(dig,n);
  62.                         break;
  63.                 case 0:
  64.                         exit(9);
  65.                 }
  66.         }
  67. }

  68. int creatAOE(vexnodel dig[])
  69. {
  70.         int vextotal,j,a,b,c;
  71.         edgenodel *p;
  72.         cout<<"input vex number:";
  73.         cin>>vextotal;
  74.         for(j=0;j<MAX;j++)
  75.         {
  76.                 dig[j].vertex=j;
  77.                 dig[j].id=0;
  78.                 dig[j].link=NULL;
  79.         }
  80.         for(j=1;j<=na;j++)
  81.         {
  82.                 cout<<"input edge<i,j>weight:";
  83.                 cin>>a>>b>>c;
  84.                 dig[b].id++;
  85.                 p=(edgenodel*)malloc(sizeof(edgenodel));
  86.                 p->adgvex=b;
  87.                 p->dut=c;
  88.                 p->next=dig[a].link;
  89.                 dig[a].link=p;
  90.         }
  91.         cout<<"output link table"<<endl;
  92.         for(j=1;j<=vextotal;j++)
  93.         {
  94.                 cout<<j<<"   "<<dig[j].id<<"   ";
  95.                 p=dig[j].link;
  96.                 while (p!=0)
  97.                 {
  98.                         cout<<p->adgvex<<"   "<<p->dut<<"   ";
  99.                         p=p->next;
  100.                 }
  101.                 cout<<endl;
  102.         }
  103.         return(vextotal);
  104. }

  105. int creatAOV(vexnode dig[])
  106. {
  107.         int vextotal,arcnumber,j,a,b;
  108.         edgenode *p;
  109.         cout<<" input vex number:";
  110.         cin>>vextotal;
  111.         cout<<" input Arc number:";
  112.         cin>>arcnumber;
  113.         for(j=0;j<MAX;j++)
  114.         {
  115.                 dig[j].id=0;
  116.                 dig[j].link=NULL;
  117.         }
  118.         for(j=1;j<=arcnumber;j++)
  119.         {
  120.                 cout<<" input vex number<i,j>:"<<endl;
  121.                 cin>>a>>b;
  122.                 dig[b].id++;
  123.                 p=(edgenode*)malloc(sizeof(edgenode));
  124.                 p->vex=b;
  125.                 p->next=dig[a].link;
  126.                 dig[a].link=p;
  127.         }
  128.         cout<<" output link table"<<endl;
  129.         for(j=1;j<=vextotal;j++)
  130.         {
  131.                 cout<<j<<"   "<<dig[j].id<<"   ";
  132.                 p=dig[j].link;
  133.                 while (p!=NULL)
  134.                 {
  135.                         cout<<p->vex<<"   ";
  136.                         p=p->next;
  137.                 }
  138.                 cout<<endl;
  139.         }
  140.         return(vextotal);
  141. }

  142. void toposort(vexnode dig[],int n)
  143. {
  144.         edgenode *p;
  145.         int i,j,k,top,m;
  146.         top=0;
  147.         m=0;
  148.         for(i=0;i<n;i++)
  149.         {
  150.                 if (dig[i].id==0)
  151.                 {
  152.                         dig[i].id=top;
  153.                         top=i;
  154.                 }
  155.         }
  156.         while (top>0)
  157.         {
  158.                 j=top;
  159.                 top=dig[top].id;
  160.                 cout<<j;
  161.                 m++;
  162.                 p=dig[j].link;
  163.                 while (p!=NULL)
  164.                 {
  165.                         k=p->vex;
  166.                         dig[k].id--;
  167.                         if (dig[k].id==0)
  168.                         {
  169.                                 dig[k].id=top;
  170.                                 top=k;
  171.                         }
  172.                         p=p->next;
  173.                         }
  174.                 cout<<"  ";
  175.         }
  176.         if (m<n)
  177.                 cout<<" The network has acycle."<<endl;
  178. }

  179. void criticalpath(vexnodel dig[],int n)
  180. {
  181.         int front=0,rear=0;
  182.         int tpord[20],vl[20],ve[20];
  183.         int l[20],e[20],i,j,k,m;
  184.         edgenodel *p;
  185.         for(i=1;i<=n;i++) ve[i]=0;
  186.         for(i=1;i<=n;i++)
  187.                 if(dig[i].id==0) tpord[++rear]=i;
  188.         m=0;
  189.         while (front!=rear)
  190.         {
  191.                 front++;
  192.                 j=tpord[front];
  193.                 m++;
  194.                 p=dig[j].link;
  195.                 while (p)
  196.                 {
  197.                         k=p->adgvex;
  198.                         dig[k].id--;
  199.                         if(dig[k].id==0) tpord[++rear]=k;
  200.                         if(ve[j]+p->dut>ve[k]) ve[k]=ve[j]+p->dut;
  201.                         p=p->next;
  202.                 }
  203.         }
  204.         if (m<n) cout<<" The AOE network has acycle"<<endl;
  205.         for(i=1;i<=n;i++) vl[i]=ve[i];
  206.         for(i=n;i>0;i--)
  207.         {
  208.                 j=tpord[i];
  209.                 p=dig[j].link;
  210.                 while (p)
  211.                 {
  212.                         k=p->adgvex;
  213.                         if ((vl[k]-p->dut)<vl[j]) vl[j]=vl[k]-p->dut;
  214.                         p=p->next;
  215.                 }
  216.         }
  217.         cout<<" output VE VL"<<endl;
  218.         for(i=1;i<=n;i++)
  219.                 cout<<ve[i]<<"   "<<vl[i]<<endl;
  220.         for(j=1,i=1;j<=n;j++,i++)
  221.         {
  222.                 p=dig[j].link;
  223.                 while (p)
  224.                 {
  225.                         k=p->adgvex;
  226.                         e[i]=ve[j];
  227.                         l[i]=vl[k]-p->dut;
  228.                         cout<<dig[j].vertex<<"   "<<dig[k].vertex<<"   "<<e[i]<<"   "<<l[i]<<"   "<<l[i]-e[i];
  229.                         if (l[i]==e[i])
  230.                                 cout<<"        CRITICAL ACTIVITY"<<endl;
  231.                         else
  232.                                 cout<<endl;
  233.                         p=p->next;
  234.                 }
  235.         }
  236. }
复制代码





                               
登录/注册后可看大图
该贴已经同步到 嘴角上扬的微博
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-9 14:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表