typedef enum GraphKind{DG,DN,UDG,UDN}; //{有向图,有向网,无向图,无向网} typedef char VertexType; typedef struct{ int adj; //顶点关系类型。对无权图,用1(是)或0(否)表示相邻否;对带权图,则为权值 int *info; //该弧相关信息的指针 }ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct{ //图的结构 VertexType vexs[MAX_VERTEX_NUM]; //顶点向量 AdjMatrix arcs; //邻接矩阵(二维数组) int vexnum,arcnum; //图的当前顶点数和弧数 GraphKind kind; //图的种类标志 }MGraph;根据这个结构体写拓扑排序和关键路径函数
时间: 2024-02-14 17:17:12 浏览: 80
数据结构-c语言-带main函数-图7.2-图的存储结构-图的邻接矩阵的创建-有向图。
5星 · 资源好评率100%
好的,下面是拓扑排序和关键路径函数的代码实现:
拓扑排序函数:
```c
void TopologicalSort(MGraph G, int *etv, int *etl){
int i, j, k, top = 0;
int stack[MAX_VERTEX_NUM], indegree[MAX_VERTEX_NUM];
for(i = 0; i < G.vexnum; i++){ //初始化入度数组
indegree[i] = 0;
}
for(i = 0; i < G.vexnum; i++){ //统计每个顶点的入度
for(j = 0; j < G.vexnum; j++){
if(G.arcs[j][i].adj != 0){
indegree[i]++;
}
}
}
for(i = 0; i < G.vexnum; i++){ //入度为0的顶点入栈
if(indegree[i] == 0){
stack[++top] = i;
}
}
for(i = 0; i < G.vexnum; i++){ //初始化事件最早发生时间
etv[i] = 0;
}
while(top != 0){ //拓扑排序
j = stack[top--];
for(k = 0; k < G.vexnum; k++){
if(G.arcs[j][k].adj != 0){
if(--indegree[k] == 0){
stack[++top] = k;
}
if(etv[j] + G.arcs[j][k].adj > etv[k]){
etv[k] = etv[j] + G.arcs[j][k].adj;
}
}
}
}
for(i = 0; i < G.vexnum; i++){ //初始化事件最晚发生时间
etl[i] = etv[G.vexnum - 1];
}
while(top != 0){ //求事件最晚发生时间
j = stack[top--];
for(k = 0; k < G.vexnum; k++){
if(G.arcs[j][k].adj != 0){
if(etl[k] - G.arcs[j][k].adj < etl[j]){
etl[j] = etl[k] - G.arcs[j][k].adj;
}
}
}
}
}
```
关键路径函数:
```c
void CriticalPath(MGraph G){
int i, j, k, etv[MAX_VERTEX_NUM], etl[MAX_VERTEX_NUM], ltv[MAX_VERTEX_NUM], lte[MAX_VERTEX_NUM];
TopologicalSort(G, etv, etl);
printf("etv: ");
for(i = 0; i < G.vexnum; i++){
printf("%d ", etv[i]);
}
printf("\n");
printf("etl: ");
for(i = 0; i < G.vexnum; i++){
printf("%d ", etl[i]);
}
printf("\n");
for(i = 0; i < G.vexnum; i++){ //求ltv和lte
ltv[i] = etl[G.vexnum - 1];
}
for(i = G.vexnum - 2; i >= 0; i--){
j = etv[i];
for(k = 0; k < G.vexnum; k++){
if(G.arcs[i][k].adj != 0){
if(ltv[k] - G.arcs[i][k].adj < j){
j = ltv[k] - G.arcs[i][k].adj;
}
}
}
ltv[i] = j;
}
printf("ltv: ");
for(i = 0; i < G.vexnum; i++){
printf("%d ", ltv[i]);
}
printf("\n");
for(i = 0; i < G.vexnum; i++){
lte[i] = etv[i];
}
for(i = 0; i < G.vexnum; i++){ //求关键路径
for(j = 0; j < G.vexnum; j++){
if(G.arcs[i][j].adj != 0){
if(lte[i] + G.arcs[i][j].adj == ltv[j]){
printf("<%c, %c> length: %d, ", G.vexs[i], G.vexs[j], G.arcs[i][j].adj);
}
}
}
}
}
```
以上是根据您提供的结构体实现的拓扑排序和关键路径函数,希望可以帮助您。如果您有任何问题,可以随时问我。
阅读全文