图的关键路径的实现

 //=======================================================================
//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,*
请按任意键继续. . .

*/

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值