关键路径代码


#include<iostream>
using namespace std;
#include<queue>
#include<vector>
#include<stack>
typedef int vertype ;
#define max 100
int book[max];
int path[max][max]={0};
struct ArcNode
{
	int adjvex;//记录一条边的右顶点的下标
	int weight;
	ArcNode *next;//下一条边
};
struct VNode
{
	 vertype data;//顶点的类型
	 int in;
	 ArcNode *firstarc;//顶点的第一条边,是连接顶点数组与单链表的桥梁
};
struct Graph 
{
	int vernum;//图顶点的总个数
	int arcnum;//图边的总个数
	VNode ver[max];//顶点数组
};
int change(Graph *G,vertype v)
{
	for(int i=1;i<=G->vernum;i++)
	{
		if(G->ver[i].data==v)
			return i;
	}
}
void creat(Graph *G)
{
	cout<<"输入图的顶点数和边数"<<endl;
	cin>>G->vernum>>G->arcnum ;
	cout<<"输入"<<G->vernum<<"个顶点的信息"<<endl;
	for(int i=1;i<=G->vernum;i++)
	{
		cin>>G->ver[i].data;
		G->ver[i].firstarc=NULL;//初始化顶点数组和边
		book[i]=0;
		G->ver[i].in=0;
	}
	cout<<"输入"<<G->arcnum<<"个边的信息(v1,v2,weight)"<<endl;
	
	for(int i=1;i<=G->arcnum;i++)
	{   
		int k=0;
		int v1,v2,weight;
		int t1,t2;
		cin>>t1>>t2>>weight;
		v1=change(G,t1);
		v2=change(G,t2);
		while(path[v2][k]!=0)
		    k++;
		path[v2][k]=v1;
		ArcNode *node=new ArcNode;
		node->adjvex=v2;//一条边的右端点
		node->next=NULL;//新创建的结点初始化
		node->weight=weight;
     
		node->next=G->ver[v1].firstarc;         //这里是头插法
		G->ver[v1].firstarc=node; 
		G->ver[v2].in++;                             //从v1到v2有边则v2的度数加加
	}
}


void criticpath(Graph *G)
{
	int ve[max],vl[max];
	int ee,el;
	for(int i=1;i<=G->vernum;i++)
	{
		ve[i]=0;
	}
	for(int i=1;i<=G->vernum;i++)
	{
		ArcNode *p=G->ver[i].firstarc;//计算事件最早发生时间
		while(p)
		{ 
			int k=p->adjvex;   //k为下一条边的下标
			if(ve[k]<ve[i]+p->weight)
			{
				ve[k]=p->weight+ve[i];
			}
			p=p->next;
		}
	}

	for(int i=1;i<=G->vernum;i++)
	{
		vl[i]=ve[G->vernum];
	}
	for(int i=G->vernum;i>=1;i--)//计算事件最晚发生时间
	{
		ArcNode *p=G->ver [i].firstarc;
		while(p)
		{
			int k=p->adjvex ;
		     if(vl[i]>vl[k]-p->weight)
				 vl[i]=vl[k]-p->weight;
			 p=p->next;
		}
	
	}

	for(int i=1;i<=G->vernum;i++)
	{
		cout<<endl;
		ArcNode *p=G->ver[i].firstarc;
		while(p)
		{
		ee=ve[i];
		el=vl[p->adjvex]-p->weight;
		if(ee==el)
		  cout<<"("<<G->ver[i].data<<","<<G->ver[p->adjvex].data<<")"<<"ee= "<<ee<<"el= "<<el<<endl;
	     	p=p->next;
		}
	}
}
int main()
{
	Graph *G=new Graph;
	creat(G);
	print(G);
	criticpath(G);
	system("pause");
}
/*
9 11
1 2 6
1 3 4
1 4 5
2 5 1
3 5 1
4 6 2
5 7 9
5 8 7
6 8 4
7 9 2
8 9 4
1 2 5 7 8 9
*/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值