| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2428 人关注过本帖
标题:拓扑排序和关键路径 。出错。求解
只看楼主 加入收藏
赛文
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2016-7-17
结帖率:0
收藏
已结贴  问题点数:20 回复次数:1 
拓扑排序和关键路径 。出错。求解
#include<stdio.h>
#include<stdlib.h>
 #include<iomanip.h>
#include <process.h>
#include <ctype.h>
typedef struct node                                    //边表结点类型
 {  int adjvex;                                           //顶点的序号
 int dut;                                                   //边上的权值
struct node *next;                                     //指向下一条边的指针
 }edgenode;
typedef struct                                          //顶点表结点
 {  int projectname;                                   //顶点域
 int id;                                                   //顶点入度
 edgenode *link;                                      //边表头指针
 }vexnode;
//建立图存储结构
void CreateGraphic(vexnode* Graphicmap,int projectnumber,int activenumber)
                                                  //projectnumber为工程的节点数,
activenumber
{  int begin,end,duttem;   
  edgenode *p;
    for(int i=0;i<projectnumber;i++)  
{  Graphicmap[i].projectname=i;      
  Graphicmap[i].id =0;      
  Graphicmap[i].link =NULL;  
}
    printf("某项目的开始到结束在图中的工程输入<vi,vj,dut>\n");
printf("如:1 3 6 回车表示第一个工程到第三各工程之间的活动用了6个小时\n");
 for(int k=0;k<activenumber;k++)  
{   scanf("%d %d %d",&begin,&end,&duttem);      
   p=(edgenode*)malloc(sizeof(edgenode));
        p->adjvex =end-1;                          //将邻接点序号j赋给新结点的邻接点域
        p->dut =duttem;
        Graphicmap[end-1].id ++;                    // 将入度加1   
     p->next =Graphicmap[begin-1].link  
        Graphicmap[begin-1].link =p;                 //将新结点插入到顶点vi的边表头部
  }
}
//求关键路径
int SearchMapPath(vexnode* Graphicmap,int projectnumber,int activenumber,int& totaltime)
 {   int i,j,k,m=0;  
  int front=-1,rear=-1;
  int* topologystack=(int*)malloc(projectnumber*sizeof(int))   //用来保存拓扑排列  
 int* vl=(int*)malloc(projectnumber*sizeof(int));           //用来表示在不推迟整个工程的前提下,VJ允许最迟发生的时间
   int* ve=(int*)malloc(projectnumber*sizeof(int));           //用来表示Vj最早发生时间   
 int* l=(int*)malloc(activenumber*sizeof(int));   
   int* e=(int*)malloc(activenumber*sizeof(int));             //表示活动最早开始时间   
edgenode *p;
   totaltime=0;
   for(i=0;i<projectnumber;i++)
 ve[i]=0;
    for(i=0;i<projectnumber;i++)
 { if(Graphicmap[i].id==0)
  {  topologystack[++rear]=i;  
m++;  }
 }
while(front!=rear)  
 {   front++;
         j=topologystack[front];      
    m++;
         p=Graphicmap[j].link     
        while(p)  
  { k=p->adjvex  
         Graphicmap[k].id --;         
   if(ve[j]+p->dut >ve[k])  
          ve[k]=ve[j]+p->dut         
    if(Graphicmap[k].id ==0)         
   topologystack[++rear]=k;         
    p=p->next   
   }
  }
if(m<projectnumber)
  { printf("\n本程序所建立的图有回路不可计算出关键路径\n");
       printf("将退出本程序\n");   
    return 0;  
 }
 totaltime=ve[projectnumber-1];     
 for(i=0;i<projectnumber;i++)   
     vl[i]=totaltime;
     for(i=projectnumber-2;i>=0;i--)  
 { j=topologystack[i];   
    p=Graphicmap[j].link   
    while(p)  
  { k=p->adjvex     
    if((vl[k]-p->dut )<vl[j])   
     vl[j]=vl[k]-p->dut   
     p=p->next  }
 }
        i=0;
printf("| 起点 | 终点 | 最早开始时间 | 最迟完成时间 | 差值 | 备注 |\n");   
    for(j=0;j<projectnumber;j++)   
 { p=Graphicmap[j].link;   
      while(p)  
 {  k=p->adjvex  
        e[++i]=ve[j];     
       l[i]=vl[k]-p->dut;
          printf("| %5d | %5d | %5d | %5d | %5d |",Graphicmap[j].projectname +1,Graphicmap[k].projectname +1,e[i],l[i],l[i]-e[i]);      
     if(l[i]==e[i])
       printf(" 关键活动 |");      
     printf("\n");     
       p=p->next
    }
   }
     return 1;  }
 //寻找关键路径
void seekkeyroot()
{    int projectnumber,activenumber,totaltime=0;  
    system("cls");
     printf("请输入这个工程个数:");  
    scanf("%d",&projectnumber);
     printf("请输入这个工程和工程之间的边数:");   
   scanf("%d",&activenumber);
     vexnode* Graphicmap=(vexnode*)malloc(projectnumber*sizeof(vexnode));      CreateGraphic(Graphicmap,projectnumber,activenumber);
     SearchMapPath(Graphicmap,projectnumber,activenumber,totaltime);  
    printf("整个工程所用的最短时间为:%d个小时\n",totaltime);  
    system("pause");
}  
int main()  
{  char ch;   
 for(;;)
 { do
   {  system("cls");  
     printf("         ===========================================\n");
         printf("         | 欢迎进入求关键路径算法程序 |\n");
         printf("%s","       (S)tart开始输入工程数据并求出关键路径\n");         
printf("%s","         (E)xit 退出!\n");  
     printf("         ===========================================\n");
         printf("%s","    请输入选择(S,E):");         
scanf("%c",&ch);        
  ch=toupper(ch);  
  }while(ch!='S'&&ch!='E');     
  switch(ch)  
  { case'S':  seekkeyroot();            
        break;      
   case'E':  return 1;  
  }
 }
}







-------------------Configuration: 123 - Win32 Debug--------------------
Compiling...
123.cpp
c:\users\赛文\desktop\123.cpp(20) : error C2146: syntax error : missing ';' before identifier 'activenumber'
c:\users\赛文\desktop\123.cpp(20) : fatal error C1004: unexpected end of file found
执行 cl.exe 时出错.

123.obj - 1 error(s), 0 warning(s)
搜索更多相关主题的帖子: include 
2016-07-17 20:52
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:20 
c:\users\赛文\desktop\123.cpp(20) : error C2146: syntax error : missing ';' before identifier 'activenumber'
意思是在“activenumber”的前面少了分号、、、然而我复制你的程序发现,,,少了7/8个分号。。。我不知道你用的什么编译器,是它没有提醒好你,还是你会不看。。
图片附件: 游客没有浏览图片的权限,请 登录注册

像是我用的Dev C++ ,可以直接定位到每一处出错的行数、列数以及错误信息。对应调整一下再说。。
还有你的程序由于我缺少<iomanip.h>头文件,估计不能运行了。你自己调试看看。
加完那十多个分号以后程序就能运行了,至于能否正确运行、、、我也不知道,你自己试试看

φ(゜▽゜*)♪
2016-07-20 12:36
快速回复:拓扑排序和关键路径 。出错。求解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016040 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved