//=======================================================================
//Use Adjacency List Find CriticalPath
//BY:CHLAWS
//TIME:08-8-7
//PS:transshipment don't delete this headmark
//=======================================================================
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20
int visited[MAX_VERTEX_NUM];
typedef char VertexType;
typedef struct ArcNode{
int adjvex; //该弧指向的顶点位置
struct ArcNode *nextarc; //指向下一个表(边)结点
int info; //权值
}ArcNode; //边结点类型
typedef struct VNode{
VertexType data;
int indegree;
ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct{
AdjList vertices; //邻接表
int vexnum,arcnum; //顶点数和弧(边)数
}ALGraph;
int LocateVex(ALGraph G,char u);
void CreateALGraph_adjlist(ALGraph &G);
void CriticalPath (ALGraph G);
void main()
{
ALGraph G;
printf("This is find criticalpath program!/n");
CreateALGraph_adjlist(G);
CriticalPath (G); //G 头是0入度,尾是0出度
}
//查找符合的数据在数组中的下标
int LocateVex(ALGraph G,char u)
{
int i;
for (i=0;i<G.vexnum;i++)
{
if(u==G.vertices[i].data)
return i;
}
if (i==G.vexnum)
{
printf("Error u!/n");
exit(1);
}
return 0;
}
void CreateALGraph_adjlist(ALGraph &G)
{
int i,j,k,w; char v1,v2;
ArcNode *p;
printf("Input vexnum & arcnum:/n");
scanf("%d,%d",&G.vexnum,&G.arcnum);
printf("Input Vertices!/n");
for (i=0;i<G.vexnum;i++)
{
printf("Input %dth vertex:/n",i);
fflush(stdin);
scanf("%c",&G.vertices[i].data);
G.vertices[i].firstarc = NULL;
G.vertices[i].indegree = 0;
}
for (k=0;k<G.arcnum;k++)
{
printf("Input Arcs(v1,v2,w):/n");
fflush(stdin);
scanf("%c,%c,%d",&v1,&v2,&w);
i=LocateVex(G,v1);
j=LocateVex(G,v2);
p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=j;
p->info = w;
p->nextarc=G.vertices[i].firstarc;
G.vertices[i].firstarc=p;
G.vertices[j].indegree++; //vi->vj vj入度+1
} return;
}
void CriticalPath (ALGraph G)
{
int i, k, e, l;
int *Ve,*Vl;
ArcNode *p;
//===========================================================
// 以下求事件最早发生时间
//===========================================================
Ve = new int[G.vexnum];
Vl = new int[G.vexnum];
for ( i = 0; i < G.vexnum; i++ )
Ve[i] = 0;
for ( i = 0; i < G.vexnum; i++ )//前推
{
ArcNode *p = G.vertices[i].firstarc;
while ( p != NULL )
{
k = p->adjvex;
if (Ve[i] + p->info > Ve[k])
Ve[k] = Ve[i] + p->info;
p = p->nextarc;
}
}
//===========================================================
// 以下求事件最迟发生时间
//===========================================================
for ( i = 0; i < G.vexnum; i++ )
Vl[i] = Ve[G.vexnum-1];
for ( i = G.vexnum-2; i; i-- ) //后推
{
p = G.vertices[i].firstarc;
while ( p != NULL )
{
k = p->adjvex;
if ( Vl[k] - p->info < Vl[i])
Vl[i] = Vl[k] - p->info;
p = p->nextarc;
}
}
for ( i = 0; i < G.vexnum; i++ )
{
p = G.vertices[i].firstarc;
while ( p != NULL )
{
k = p->adjvex;
e = Ve[i]; l = Vl[k] - p->info;
char tag= (e == l) ? '*' : ' ';
printf("(%c,%c),e=%d,l=%d,%c/n",G.vertices[i].data,G.vertices[k].data,e,l,tag);
p = p->nextarc;
}
}
delete[] Ve;
delete[] Vl;
}
/*
This is find criticalpath program!
Input vexnum & arcnum:
9,11
Input Vertices!
Input 0th vertex:
A
Input 1th vertex:
B
Input 2th vertex:
C
Input 3th vertex:
D
Input 4th vertex:
E
Input 5th vertex:
F
Input 6th vertex:
G
Input 7th vertex:
H
Input 8th vertex:
I
Input Arcs(v1,v2,w):
A,B,6
Input Arcs(v1,v2,w):
A,C,4
Input Arcs(v1,v2,w):
A,D,5
Input Arcs(v1,v2,w):
B,E,1
Input Arcs(v1,v2,w):
C,E,1
Input Arcs(v1,v2,w):
D,F,2
Input Arcs(v1,v2,w):
E,G,9
Input Arcs(v1,v2,w):
E,H,7
Input Arcs(v1,v2,w):
F,H,4
Input Arcs(v1,v2,w):
G,I,2
Input Arcs(v1,v2,w):
H,I,4
(A,D),e=0,l=3,
(A,C),e=0,l=2,
(A,B),e=0,l=0,*
(B,E),e=6,l=6,*
(C,E),e=4,l=6,
(D,F),e=5,l=8,
(E,H),e=7,l=7,*
(E,G),e=7,l=7,*
(F,H),e=7,l=10,
(G,I),e=16,l=16,*
(H,I),e=14,l=14,*
请按任意键继续. . .
*/