| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1143 人关注过本帖
标题:怎样把这个代码改的简单些,能够对AOV拓扑排序,求AOE的关键路径,和关键活 ...
只看楼主 加入收藏
MVK
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2019-6-10
结帖率:100%
收藏
 问题点数:0 回复次数:0 
怎样把这个代码改的简单些,能够对AOV拓扑排序,求AOE的关键路径,和关键活动,#C#C++
#include<iostream>
#include<stdio.h>
#include<conio.h>
#include<malloc.h>
#define MAX_VEXTEX_NUM 40
using namespace std;

typedef struct edgenode
{
    int endvex;   /*相邻顶点在顶点表中的下标*/
    int weight;   /*边的权值*/
    struct edgenode *nextedge;   /*链字段*/
}EdgeNode,*EdgeList;  /*边表中的结点*/

typedef struct
{
    int vertex;   /*顶点*/
    EdgeList edgelist;   /*边表头指针*/
}VexNode,AdjList[MAX_VEXTEX_NUM];  /*顶点表中的结点*/

typedef struct{
    int vexnum;  /*图的顶点数*/
    int arcnum;  /*图的边的个数*/
    AdjList vexs;   /*顶点表*/
}  GraphList; /*图的邻接表表示法*/

void FindInDegree(GraphList *G,int *indegree);
int TopoSort(GraphList *G,int *ptopo);  /*拓扑排序*/
int CriticalPath(GraphList *G) ; /*关键路径*/

/*关键路径*/
int CriticalPath(GraphList *G)
{
    int i,j,k,sum=0;
    EdgeList p;
    int *ee=(int *)malloc(sizeof(int)*G->vexnum);
    int *le=(int *)malloc(sizeof(int)*G->vexnum);
    int *l=(int *)malloc(sizeof(int)*G->vexnum);
    int *e=(int *)malloc(sizeof(int)*G->vexnum);
    int *topo=(int *)malloc(sizeof(int)*G->vexnum);
    if(TopoSort(G,topo)==0)
    {
        printf("该AOV网有环!\n");
        getch();
        return(0);
    }
    /*求事件可能的最早发生时间*/
    for(i=0; i<G->vexnum; i++)
        ee[i]=0;
    for(k=0; k<G->vexnum; k++)
    {
        i=topo[k];
        p=G->vexs[i].edgelist;
        while(p!=NULL)
        {
            j=p->endvex;
            if(ee[i]+p->weight>ee[j])
                ee[j]=ee[i]+p->weight;
            p=p->nextedge;
        }
    }
    sum=ee[G->vexnum-1]; /*工程的最短完成时间*/
    for(i=0; i<G->vexnum; i++)  /*求事件允许的最迟发生时间*/
        le[i]=ee[G->vexnum-1];
    for(k=G->vexnum-2; k>=0; k--)
    {
        i=topo[k];
        p=G->vexs[i].edgelist;
        while(p!=NULL)
        {
            j=p->endvex;
            if((le[j]-p->weight)<le[i])
                le[i]=le[j]-p->weight;
            p=p->nextedge;
        }
    }
    k=0;
    printf("\n关键路径:\n");
    printf("各活动的最早发生时间依次为:\n");
    for(int q=0;q<G->vexnum;q++)
        printf("%d' '\n",ee[q]);
    printf("各活动的最晚发生时间依次为:\n");
    for(int q=0;q<G->vexnum;q++)
        printf("%d' '\n",le[q]);
    /*求活动 ak 的最早开始时间 early(k)和最晚开始时间 late(k)*/
    printf("\n|   活动   |  最早  |   最晚  |   差值  |  是否关键 ? \n");
    for(i=0;i<G->vexnum;i++)
    {
        p=G->vexs[i].edgelist;
        while(p!=NULL)
        {
            j=p->endvex;
            e[k]=ee[i];
            l[k]=le[j]-p->weight;
            printf("|  <%d,%d>   |  %4d  |  %4d  | %4d   | ",i,j,e[k],l[k],l[k]-e[k]);
            if(e[k]==l[k])
                printf("     YES"); /*输出是否关键*/
            else
                printf("     NO");
            printf("\n");
            k++;
            p=p->nextedge;
        }
    }
    printf("\n最短完成时间: %d\n",sum);  /*最短完成时间*/
    printf("\n");
    getch();
    return(1);
}
/*初始化图*/
void InitGraph(GraphList *G)
{
    int i,vexnum,arcnum,weight=0;
    int v1,v2;
    EdgeList p;
    printf("请输入顶点数和边数-->(如:x,y)\n"); /*输入顶点数和边数*/
    scanf("%d,%d",&vexnum,&arcnum); /*输入注意逗号隔开*/
    G->vexnum=vexnum;
    G->arcnum=arcnum;
    for(i=0;i<vexnum;i++)
    {
        G->vexs[i].vertex=i+1;
        G->vexs[i].edgelist=NULL;
    }
    for(i=0;i<arcnum;i++)
    {
        printf("请输入各个连接点及其权值-->(如: 1,2,10 )\n");  /*输入各个连接点及其权值*/
        scanf("%d,%d,%d",&v1,&v2,&weight);  /*输入注意逗号隔开*/
        if(v1>G->vexnum||v2>G->vexnum)
        {
            printf("你输入的节点数不符合条件!!"); /*判断输入点是否复合条件*/
            printf("\n");
            getch();
            exit(0);
        }
        p=(EdgeList)malloc(sizeof(EdgeNode));
        p->endvex=v2;
        p->weight=weight;
        p->nextedge=G->vexs[v1].edgelist;
        G->vexs[v1].edgelist=p;
    }
}
 /*拓扑排序*/
int TopoSort(GraphList *G,int *ptopo)
{
    EdgeList p;
    int i,j,k,nodeno=0,top=-1;
    int *indegree=(int *)malloc(sizeof(int)*G->vexnum);
    FindInDegree(G,indegree); /*indegree 数组赋初值*/
    for(i=0; i<G->vexnum; i++)  /* 将入度为零的顶点入栈*/
        if(indegree[i]==0)
        {   /*静态链式栈*/
            indegree[i]=top;
            top=i;
        }
        while(top!=-1)
        {
            j=top;
            top=indegree[top];  /*取当前栈顶元素并退栈*/
            ptopo[nodeno++]=j;  /*将该顶点输出到拓扑序列中*/
            p=G->vexs[j].edgelist; /*取该元素边表中的第一个边结点*/
            while(p)
            {
                k=p->endvex;
                indegree[k]--;     /*删除以该顶点为起点的边*/
                if(indegree[k]==0)
                {
                    indegree[k]=top;  /*将新的入度为零的顶点入栈*/
                    top=k;
                }
                p=p->nextedge;
            }
        }
        free(indegree);
        if(nodeno<G->vexnum)
            return(0);   /*AOV 网中存在回路*/
        else
            return(1);
}
/*求出图中所有顶点的入度*/
void FindInDegree(GraphList *G,int *indegree)
{
    int i;
    EdgeList p;
    for(i=0; i<G->vexnum; i++)
        indegree[i]=0;
    for(i=0; i<G->vexnum; i++)
    {
        p=G->vexs[i].edgelist;
        while(p)
        {
            ++indegree[p->endvex];
            p=p->nextedge;
        }
    }
}

void TopoSortMenu(void)
{
    int *ptopo;
    int i;
    GraphList *Graph=(GraphList *)malloc(sizeof(GraphList));
    InitGraph(Graph);
    ptopo=(int *)malloc(sizeof(int)*Graph->vexnum);
    if(TopoSort(Graph,ptopo)!=0)
    {
        printf("\n拓扑排序:\n");
        for(i=0;i<Graph->vexnum-1;i++)
            printf("v%d-->",ptopo[i]); /* 打印前 n-1 个 ( 有 -->)*/
        printf("v%d",ptopo[i]);  /*打印最后一个(没有-->)*/
        printf("\n\n");
    }
    else
        printf("该AOV网有环!\n");
    getch();
    free(ptopo);
    free(Graph);
}

void CriticalMenu(void)
{
    GraphList *Graph=(GraphList *)malloc(sizeof(GraphList));
    InitGraph(Graph);
    CriticalPath(Graph);
    free(Graph);
}
void TopoCriticalMenu(void)
{
    char ch;
    while(1)
    {
        printf("***************《功能菜单》****************\n");
        printf("        请选择:                           \n");
        printf("                     1.拓扑排序            \n");
        printf("                     2.关键路径            \n");
        printf("                     0.退出                \n");
        printf("*******************************************\n");
        ch=getch();
        switch(ch-'0')
        {
        case 0: exit(0);
        case 1: TopoSortMenu(); break;
        case 2: CriticalMenu(); break;
        }
    }
}

int main(void)
{
    TopoCriticalMenu();
}
搜索更多相关主题的帖子: malloc int void printf for 
2019-06-13 09:50
快速回复:怎样把这个代码改的简单些,能够对AOV拓扑排序,求AOE的关键路径,和关 ...
数据加载中...
 
   



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

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