求关键路径、AOE网

 终于把关键路径搞定了,以前学习的时候,对什么最早发生时间,最迟反生时间,活动最早开始时间,活动最晚开始时间,都是一塌糊涂的,昨晚宿友的一番解释,终于搞定了,谢谢兵哥!!哈哈!!
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct node
{
	int x;
	int v;
	int next;
	int info;
}enode[10005];
int l[10005],e[10005];
int stack[1005],degee[1005];
int in[1005],ve[1005],vl[1005];
int top,count,num,n,m;
int head[1005];
int vetime()
{
	int i,j;
	top=-1;
	num=-1;
	count=0;
	for(i=1;i<=n;i++)
	{
		if(in[i]==0)
		{
			degee[++num]=i;
			ve[i]=0;
		}
	}
	while(num!=-1)
	{
		j=degee[num];
		num--;
		stack[++top]=j;
		count++;
		for(i=head[j];i;i=enode[i].next)
		{
			int k=enode[i].v;
			in[k]--;
			if(in[k]==0)
			{
				degee[++num]=k;
			}
			if(ve[j]+enode[i].info>ve[k])
			{
				ve[k]=ve[j]+enode[i].info;
			}
		}
	}
	if(count<n)
		return 0;
	else
		return 1;
}
void vltime()
{
	int i,j;
	for(i=1;i<=n;i++)
	{
		vl[i]=ve[n];
	}
	while(top!=-1)
	{
		j=stack[top];
		top--;
		for(i=head[j];i;i=enode[i].next)
		{
			int k=enode[i].v;
			if(vl[k]-enode[i].info<vl[j])
			{
				vl[j]=vl[k]-enode[i].info;
			}
		}
	}
}
void guanjian()
{
	int i,u=0;
	int path[1005];
	for(i=1;i<=m;i++)
	{
		e[i]=ve[enode[i].x];
		l[i]=vl[enode[i].v]-enode[i].info;
	}
	printf("关键活动\n");
	for(i=1;i<=m;i++)
	{
		if(e[i]==l[i])
		{
			printf("%d ",i);
			path[u++]=i;
		}
	}
	printf("\n");
	printf("关键路径\n");
	printf("%d %d ",enode[path[0]].x,enode[path[0]].v);
	for(i=1;i<u;i++)
		printf("%d ",enode[path[i]].v);
	printf("\n");

}
int main()	
{
	//freopen("a.txt","r",stdin);
	int x,y,w;
	scanf("%d%d",&n,&m);
	memset(head,0,sizeof(head));
	memset(in,0,sizeof(in));
	int t=1;
	while(m--)
	{
		scanf("%d%d%d",&x,&y,&w);
		enode[t].x=x;
		enode[t].v=y;
		enode[t].info=w;
		enode[t].next=head[x];
		head[x]=t;
		t++;
		in[y]++;
	}
	m=t-1;
	if(vetime()==0)
	{
		printf("有环\n");
	}
	else
	{
		vltime();
		guanjian();
	}
	//system("pause");
	return 0;
}



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值