基本算法思路是严蔚敏那本《数据结构》所讲。中间发现有个地方有错误,我改正了,然后能得到最终结果。代码如下: /* 图用邻接表存储 输出关键路径 图中弧的指向都是向右的 v2 v7 /// / /// / / / / / a1=6/ /a4=1 / /a10=2 / / /a7=9 / / /// / /// v1 v5 v9 | / /// / /// | /a2=4 / /a8=7 / | / /a5=1 / /a11=4 | / / / / a3=5| /// / /// / | v3 v8 | /// | / | /a9=4 ||| / v4---------------v6 a6=2 */ #include <iostream> #include <stack> using namespace std; const int maxVertexNum = 10; typedef struct ArcNode { int adjvex; //该弧所指向的顶点在Adjust即ALGraph.vertices中的位置 ArcNode* nextarc; //指向下一条弧的指针 int info; //弧信息 }ArcNode, *PArcNode; typedef struct VNode { char data; //顶点信息 ArcNode* firstarc; //指向第一条依附于该节点的弧的指针 }VNode, Adjust[maxVertexNum]; typedef struct ALGraph { Adjust vertices; //顶点数组 int vexnum; //顶点数 int arcnum; //弧数 int kind; //1(无向图),2(有向图) }ALGraph; void BuildGraph(ALGraph& G) { G.vexnum = G.arcnum = 0; G.kind = 2; ArcNode* pFirst = NULL; ArcNode* pCurrent = NULL; ArcNode* pArc = NULL; //V1 pArc = new ArcNode; pArc->adjvex = 1; pArc->info = 6; G.arcnum++; pFirst = pCurrent = pArc; pArc = new ArcNode; pArc->adjvex = 2; pArc->info = 4; pCurrent->nextarc = pArc; pCurrent = pArc; G.arcnum++; pArc = new ArcNode; pArc->adjvex = 3; pArc->info = 5; pCurrent->nextarc = pArc; pArc->nextarc = NULL; G.arcnum++; G.vertices[G.vexnum].data = '1'; G.vertices[G.vexnum++].firstarc = pFirst; //V2 pArc = new ArcNode; pArc->adjvex = 4; pArc->info = 1; pArc->nextarc = NULL; G.arcnum++; G.vertices[G.vexnum].data = '2'; G.vertices[G.vexnum++].firstarc = pArc; //V3 pArc = new ArcNode; pArc->adjvex = 4; pArc->info = 1; pArc->nextarc = NULL; G.arcnum++; G.vertices[G.vexnum].data = '3'; G.vertices[G.vexnum++].firstarc = pArc; //V4 pArc = new ArcNode; pArc->adjvex = 5; pArc->info = 2; pArc->nextarc = NULL; G.arcnum++; G.vertices[G.vexnum].data = '4'; G.vertices[G.vexnum++].firstarc = pArc; //V5 pArc = new ArcNode; pArc->adjvex = 6; pArc->info = 9; G.arcnum++; pFirst = pCurrent = pArc; pArc = new ArcNode; pArc->adjvex = 7; pArc->info = 7; pCurrent->nextarc = pArc; pArc->nextarc = NULL; G.arcnum++; G.vertices[G.vexnum].data = '5'; G.vertices[G.vexnum++].firstarc = pFirst; //V6 pArc = new ArcNode; pArc->adjvex = 7; pArc->info = 4; pArc->nextarc = NULL; G.arcnum++; G.vertices[G.vexnum].data = '6'; G.vertices[G.vexnum++].firstarc = pArc; //V7 pArc = new ArcNode; pArc->adjvex = 8; pArc->info = 2; pArc->nextarc = NULL; G.arcnum++; G.vertices[G.vexnum].data = '7'; G.vertices[G.vexnum++].firstarc = pArc; //V8 pArc = new ArcNode; pArc->adjvex = 8; pArc->info = 4; pArc->nextarc = NULL; G.arcnum++; G.vertices[G.vexnum].data = '8'; G.vertices[G.vexnum++].firstarc = pArc; //V9 G.vertices[G.vexnum].data = '9'; G.vertices[G.vexnum++].firstarc = NULL; } void DestroyGraph(ALGraph G) { PArcNode pCurrent = NULL; PArcNode pNext = NULL; for(int i = 0; i < G.vexnum; i++) { for(pCurrent = G.vertices[i].firstarc; pCurrent; pCurrent = pNext) { pNext = pCurrent->nextarc; delete pCurrent; G.arcnum--; } } } bool TopologicalOrder(const ALGraph& G, stack<int>& T, int* ve) { int* indegree = new int[G.vexnum]; for(int i = 0; i < G.vexnum; i++) indegree[i] = 0; for(int i = 0; i < G.vexnum; i++) { for(PArcNode p = G.vertices[i].firstarc; p; p = p->nextarc) { indegree[p->adjvex]++; } } stack<int> S; for(int i = 0; i < G.vexnum; i++) { if(!indegree[i]) S.push(i); } while(!T.empty()) T.pop(); int count = 0; for(int i = 0; i < G.vexnum; i++) ve[i] = 0; while(!S.empty()) { int j = S.top(); S.pop(); T.push(j); ++count; for(PArcNode p = G.vertices[j].firstarc; p; p = p->nextarc) { int k = p->adjvex; if(--indegree[k] == 0) S.push(k); if(ve[j] + p->info > ve[k]) ve[k] = ve[j] + p->info; } } delete[] indegree; if(count < G.vexnum) return false; else return true; } bool CriticalPath(const ALGraph& G) { int* ve = new int[G.vexnum]; memset(ve, 0, G.vexnum*sizeof(int)); int* vl = new int[G.vexnum]; memset(vl, 0, G.vexnum*sizeof(int)); stack<int> T; if(!TopologicalOrder(G, T, ve)) return false; for(int i = 0; i < G.vexnum; i++) vl[i] = ve[i]; while(!T.empty()) { int j = T.top(); T.pop(); for(PArcNode p = G.vertices[j].firstarc; p; p = p->nextarc) { int k = p->adjvex; if(vl[k] - p->info > vl[j]) vl[j] = vl[k] - p->info; } } for(int j = 0; j < G.vexnum; j++) { for(PArcNode p = G.vertices[j].firstarc; p; p = p->nextarc) { int k = p->adjvex; int ee = ve[j]; int el = vl[k] - p->info; if(ee == el) { cout << j+1 << "-->" << k+1 << " " << ee << endl; } } } delete[] ve; delete[] vl; return true; } int main() { ALGraph myGraph; BuildGraph(myGraph); CriticalPath(myGraph); DestroyGraph(myGraph); return 0; }