#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
*/
关键路径代码
最新推荐文章于 2024-03-01 20:56:59 发布