| 发表于:2007-01-26 22:51:224楼 得分:0 |
#include <stdio.h> #include "stack.h " #include "graph.h " /*求各顶点的入度*/ void findid(const graph *g, int *id) { int i; arcnode *p; for(i=0;i <=g-> vernum-1;i++) id[i] = 0; for(i=0;i <=g-> vernum-1;i++) { p = g-> vertex[i].firstin; while(p) { id[i]++; p = p-> headlink; } } }/*findid*/ /*g为有向网,t为返回的逆拓扑排序的栈,数组ve存放每个顶点的最早发生时间*/ int topoorder(const graph *g, stack t, int *ve) { int count, i, j, k; arcnode *p; int indegree[max_vertex_num]; //各顶点入度 stack s; //求拓扑排序的栈 initstack(&s); findid(g, indegree); for(i=0;i <=g-> vernum-1;i++) /*入度为0的顶点入栈*/ if(!indegree[i]) push(s, i); for(i=0;i <=g-> vernum-1;i++) /*初始化最早发生时间*/ ve[i] = 0; count = 0; while(!isempty(s)) { j = pop(s); push(t, j); count++; p = g-> vertex[j].firstout; while(p) { k = p-> headvex; if(--indegree[k]==0) push(s, k); /*若顶点入度减为0,则入栈*/ ve[k] = (ve[j]+p-> weight > ve[k])? (ve[j] + p-> weight): ve[k]; p = p-> taillink; } } if(count <g-> vernum) /*图中有圈*/ return 0; else return 1; }/*topoorder*/ /*关键路径算法*/ int criticalpath(graph *g) { int i, j, k, dut, ei, li, tag; int ve[max_vertex_num]; //每个顶点的最早发生时间 int vl[max_vertex_num]; //每个顶点的最晚发生时间 arcnode *p; stack t; initstack(&t); if(!topoorder(g, t, ve)) /*图中有圈,无关键路径*/ return 0; for(i=0;i <=g-> vernum-1;i++) /*将各顶点事件的最迟发生时间初始化为汇点的最迟发生时间*/ vl[i] = ve[g-> vernum-1]; while(!isempty(t)) { j = pop(t); p = g-> vertex[j].firstout; while(p) { k = p-> headvex; dut = p-> weight; if(vl[k]-dut <vl[j]) vl[j] = vl[k] - dut; p = p-> taillink; } } for(j=0;j <=g-> vernum-1;j++) { p= g-> vertex[j].firstout; while(p) { k = p-> headvex; dut = p-> weight; ei = ve[j]; li =vl[k] -dut; tag = (ei==li)? '* ': ' '; /*标记并输出关键活动*/ printf( "%c-> %c: %d %d %d %c\n ", g-> vertex[j].data, g- > vertex[k].data, dut, ei, li, tag); p = p-> taillink; } } return 1; }/*criticalpath*/ | | |
|