// exam1.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <stack> using namespace std; #define MAXVEX 20 typedef struct ArcNode { int adjvex; int weight; struct ArcNode* nextarc; }ArcNode; typedef struct HeadNode { int data; ArcNode* firstarc; }HeadNode; typedef struct ALGraph { int arcnum; int vexnum; int* ve; int* vl; HeadNode vex[MAXVEX]; }ALGraph; void InitALGraph(ALGraph& G) { cout<<"please enter the number of the vertex:"<<endl; cin>>G.vexnum; G.arcnum=0; for(int i=1;i<G.vexnum+1;i++) { G.vex[i].data=i; G.vex[i].firstarc=NULL; } cout<<"please enter the Arc..."<<endl; cout<<"head tail weight"<<endl; int adj1,adj2,w; while(cin>>adj1>>adj2>>w) { G.arcnum++; ArcNode* arc; arc=G.vex[adj1].firstarc; if(arc==NULL) { G.vex[adj1].firstarc=(ArcNode*)malloc(sizeof(ArcNode)); arc=G.vex[adj1].firstarc; arc->adjvex=adj2; arc->weight=w; arc->nextarc=NULL; } else { while(arc->nextarc) { arc=arc->nextarc; } arc->nextarc=(ArcNode*)malloc(sizeof(ArcNode)); arc->nextarc->adjvex=adj2; arc->nextarc->weight=w; arc->nextarc->nextarc=NULL; } } for(int i=1;i<G.vexnum+1;i++) { cout<<"vextex"<<i<<"'s adjacent vertices are:"; ArcNode* arc; arc=G.vex[i].firstarc; while(arc!=NULL) { cout<<arc->adjvex<<"-"<<arc->weight<<" "; arc=arc->nextarc; } cout<<endl; } } void CalIndegree(ALGraph G,int* indegree) { for(int i=1;i<G.vexnum+1;i++) { ArcNode* arc; arc=G.vex[i].firstarc; while(arc!=NULL) { indegree[arc->adjvex]++; arc=arc->nextarc; } } } int TopologicalOrder(ALGraph &G,stack<int> &TNode) { int *indegree=(int*)malloc(sizeof(int)*(G.vexnum+1)); memset(indegree,sizeof(int)*(G.vexnum+1)); G.ve=(int*)malloc(sizeof(int)*(G.vexnum+1)); memset(G.ve,sizeof(int)*(G.vexnum+1)); CalIndegree(G,indegree); stack<int> s; for(int i=1;i<G.vexnum+1;i++) { if(indegree[i]==0) { s.push(i); } } cout<<"The topological sort of the graph is"<<endl; int count=0; while(!s.empty()) { int i=s.top(); TNode.push(i); s.pop(); cout<<i<<" "; count++; ArcNode* arc; arc=G.vex[i].firstarc; while(arc!=NULL) { if(G.ve[i]+arc->weight>G.ve[arc->adjvex]) { G.ve[arc->adjvex]=G.ve[i]+arc->weight; } if(--indegree[arc->adjvex]==0) { s.push(arc->adjvex); } arc=arc->nextarc; } } cout<<endl; if(count==G.vexnum) { cout<<"No loop in the graph..."<<endl; } else { cout<<"There are a loop in the graph..."<<endl; return 0; } cout<<"The early staring time is:"<<endl; for(int i=1;i<G.vexnum+1;i++) { cout<<G.ve[i]<<" "; } cout<<endl; return 1; } void CriticalPath(ALGraph G) { G.vl=(int*)malloc(sizeof(int)*(G.vexnum+1)); memset(G.vl,sizeof(int)*(G.vexnum+1)); stack<int> s; if(TopologicalOrder(G,s)) { for(int i=1;i<G.vexnum+1;i++) { G.vl[i]=G.ve[G.vexnum]; } while(!s.empty()) { int i=s.top(); s.pop(); ArcNode* arc; arc=G.vex[i].firstarc; while(arc!=NULL) { int k=arc->adjvex; if(G.vl[k]-arc->weight<G.vl[i]) { G.vl[i]=G.vl[k]-arc->weight; } arc=arc->nextarc; } } } else { return; } cout<<"The laster starting time is:"<<endl; for(int i=1;i<G.vexnum+1;i++) { cout<<G.vl[i]<<" "; } cout<<endl; cout<<"The critical path of the graph is:"<<endl; for(int i=1;i<G.vexnum+1;i++) { ArcNode* arc; arc=G.vex[i].firstarc; while(arc!=NULL) { int k=arc->adjvex; if(G.ve[i]==G.vl[k]-arc->weight) { cout<<G.vex[i].data<<"->"<<G.vex[k].data<<endl; } arc=arc->nextarc; } } return; } int main(void) { ALGraph G; InitALGraph(G); CriticalPath(G); system("pause"); return 0; }
原文链接:https://www.f2er.com/datastructure/383020.html