DAG图中的关键路径算法

来源:互联网 发布:unity3d 游戏手柄 编辑:程序博客网 时间:2024/05/21 19:29

什么是DAG图中的关键路径?简单的将就是不可以推辞的活动组成的路径,这对于工程上有着极其重要的应用,利用关键路径算法可以计算那些事件是不可推辞的,必须如期完成,下面是代码:

//关键路径算法//图的邻接矩阵表示法#include <stdio.h>#include <stdlib.h>#include <string.h>#include <stack>#include <queue>using namespace std;#define Max 100#define Inf 0x1111typedef char type;typedef struct Grap{type data[Max];int value[Max][Max];int n,m;}Grap,*pgrap;int Located(pgrap g,char ch){for(int i=0;i<g->n;i++)if(g->data[i]==ch)return i;}int invalue[Max];int ve[Max];int vl[Max];bool trag;stack<int> s;stack<int> t;void Creat_grap(pgrap g){printf("输入图的顶点数和边数:\n");scanf("%d%d",&g->n,&g->m);//printf("ksgfdkj\n");getchar();printf("输入图中的顶点:\n");int i,j;for(i=0;i<g->n;i++){g->data[i]=getchar();getchar();}for(i=0;i<g->n;i++)for(j=0;j<g->n;j++)g->value[i][j]=Inf;printf("请输入图中的边:\n");int index1,index2,value;char ch1,ch2;while(g->m--){scanf("%c,%c,%d",&ch1,&ch2,&value);getchar();index1=Located(g,ch1);index2=Located(g,ch2);g->value[index1][index2]=value;//无向图//g->value[index2][index1]=value;}}void In_value(pgrap g){memset(invalue,0,sizeof(invalue));for(int i=0;i<g->n;i++)for(int j=0;j<g->n;j++)if(g->value[j][i]!=Inf)invalue[i]++;}void tuopu(pgrap g){int i,index,count=0;trag=true;memset(ve,0,sizeof(ve));for(i=0;i<g->n;i++)if(invalue[i]==0)s.push(i);while(!s.empty()){index=s.top();s.pop();t.push(index);count++;for(i=0;i<g->n;i++)if(g->value[index][i]!=Inf){if(--invalue[i]==0)s.push(i);if(ve[index]+g->value[index][i]>ve[i])ve[i]=ve[index]+g->value[index][i];}}if(count<g->n)trag=false;}void Keyway(pgrap g){if(!trag){printf("图中存在环\n");return ;}int i,j,index,end=t.top();for(i=0;i<g->n;i++)vl[i]=ve[end];while(!t.empty()){index=t.top();t.pop();for(i=0;i<g->n;i++)if(g->value[index][i]!=Inf)if(vl[i]-g->value[index][i]<vl[index])vl[index]=vl[i]-g->value[index][i];}int early,later;char tragg;for(i=0;i<g->n;i++)for(j=0;j<g->n;j++)if(g->value[i][j]!=Inf){early=ve[i];    later=vl[j]-g->value[i][j];tragg=(early==later)?'Y':'N';printf("类型,起点,终点,最早发生时间,最晚发生时间,活动耗时\n");printf("%c,%c,%c,%d,%d,%d\n",tragg,g->data[i],g->data[j],early,later,g->value[i][j]);}}int main(){Grap g;pgrap p=&g;Creat_grap(p);In_value(p);tuopu(p);Keyway(p);return 0;}


 

测试数据:

输入图的顶点数和边数:
6 9
输入图中的顶点:
A
B
C
D
E
F
请输入图中的边:
A,B,1
A,C,3
B,D,4
B,C,1
C,D,1
D,E,2
C,E,1
E,F,1
D,F,1
类型,起点,终点,最早发生时间,最晚发生时间,活动耗时
Y,A,B,0,0,1
类型,起点,终点,最早发生时间,最晚发生时间,活动耗时
N,A,C,0,1,3
类型,起点,终点,最早发生时间,最晚发生时间,活动耗时
N,B,C,1,3,1
类型,起点,终点,最早发生时间,最晚发生时间,活动耗时
Y,B,D,1,1,4
类型,起点,终点,最早发生时间,最晚发生时间,活动耗时
N,C,D,3,4,1
类型,起点,终点,最早发生时间,最晚发生时间,活动耗时
N,C,E,3,6,1
类型,起点,终点,最早发生时间,最晚发生时间,活动耗时
Y,D,E,5,5,2
类型,起点,终点,最早发生时间,最晚发生时间,活动耗时
N,D,F,5,7,1
类型,起点,终点,最早发生时间,最晚发生时间,活动耗时
Y,E,F,7,7,1


Terminated with return code 0
Press any key to continue ...

 


 

原创粉丝点击