DAG图中的关键路径算法

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

//关键路径算法
//图的邻接矩阵表示法
#include 
#include 
#include 
#include 
#include 
using namespace std;
#define Max 100
#define Inf 0x1111
typedef 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;in;i++)
		if(g->data[i]==ch)
			return i;
}
int invalue[Max];
int ve[Max];
int vl[Max];
bool trag;
stack s;
stack 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;in;i++){
		g->data[i]=getchar();
		getchar();
	}
	for(i=0;in;i++)
		for(j=0;jn;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;in;i++)
		for(int j=0;jn;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;in;i++)
		if(invalue[i]==0)
			s.push(i);
	while(!s.empty()){
		index=s.top();
		s.pop();
		t.push(index);
		count++;
		for(i=0;in;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(countn)
		trag=false;
}
void Keyway(pgrap g){
	if(!trag){
		printf("图中存在环\n");
		return ;
	}
	int i,j,index,end=t.top();
	for(i=0;in;i++)
		vl[i]=ve[end];
	while(!t.empty()){
		index=t.top();
		t.pop();
		for(i=0;in;i++)
			if(g->value[index][i]!=Inf)
				if(vl[i]-g->value[index][i]value[index][i];
	}
	int early,later;
	char tragg;
	for(i=0;in;i++)
		for(j=0;jn;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 ...

 


 

你可能感兴趣的:(acm)