关键路径实现
来源:互联网 发布:软件技术基础和c语言 编辑:程序博客网 时间:2024/04/27 22:23
-
- #include "stdafx.h"
- #include<iostream>
- #include<cassert>
- #include"F:/QGX_TEMP/HEADFILE/STACK.h"
- using namespace std;
- #define N 9
- #define INFINIT 30000 //无穷大
- bool PriTime(int G[N+1][N+1],int PT[])
- {
-
- int vcount=0;
- for(int i=1;i<=N;i++)
- PT[i]=-1;
- PT[1]=0;
- STACK<int> *S=new STACK<int>(N);
- if(!S)exit(1);
- int *indegree=new int[N+1];
- if(!indegree)exit(1);
- for(int i=2;i<=N;i++)
- {
- indegree[i]=0;
- for(int j=1;j<=N;j++)
- if(j!=i && G[j][i]>0 && G[j][i]<INFINIT)indegree[i]++;
- }
- S->push(1);
- while(!S->empty() && vcount<N)
- {
- int temp;
- if(S->pop(temp))NULL;
- vcount++;
- for(int k=2;k<=N;k++)
- {
- if(temp!=k && G[temp][k]>0 && G[temp][k]<INFINIT)
- {
- indegree[k]--;
- if(G[temp][k]+PT[temp]>PT[k])PT[k]=G[temp][k]+PT[temp];
- if(!indegree[k])S->push(k);
- }
- }
- }
- delete[] indegree;
- delete S;
- return vcount>=N;
- }
- bool LasTime(int G[N+1][N+1],int MAXPATH,int LT[])
- {
-
-
-
- int vcount=0;
- for(int k=1;k<=N;k++)
- LT[k]=MAXPATH;
-
- STACK<int> *S=new STACK<int>(N);
- if(!S)exit(1);
- int *outdegree=new int[N+1];
- if(!outdegree)exit(1);
- for(int i=1;i<=N;i++)
- {
- outdegree[i]=0;
- for(int j=1;j<=N;j++)
- if(G[i][j]>0 && G[i][j]<INFINIT)outdegree[i]++;
- }
- S->push(N);
- while(!S->empty() && vcount<N)
- {
- int temp;
- if(S->pop(temp))NULL;
- vcount++;
- for(int k=1;k<N;k++)
- {
- if(temp!=k && G[k][temp]>0 && G[k][temp]<INFINIT)
- {
- outdegree[k]--;
- if(LT[temp]-G[k][temp]<LT[k])LT[k]=LT[temp]-G[k][temp];
- if(!outdegree[k])S->push(k);
- }
- }
- }
- delete[] outdegree;
- delete S;
- return vcount>=N;
- }
- bool pivotalpath(int G[N+1][N+1],int path[],int &size)
- {
-
-
-
- assert(N>0);
- int *pt=new int[N+1];
- if(!pt)exit(1);
- int *lt=new int[N+1];
- if(!lt)exit(1);
-
-
- if(!PriTime(G,pt)){ delete[] lt;delete[] pt;return false;}
-
-
-
-
- cout<<"此有向图从起点到终点的最长路径长度为:"<<pt[N]<<endl;
-
- if(!LasTime(G,pt[N],lt)){delete[] lt;delete[] pt;return false;}
-
-
-
-
-
- size=0;
- for(int k=1;k<=N;k++)
- if(pt[k]==lt[k])path[size++]=k;
- delete[] lt;
- delete[] pt;
- return true;
- }
- void INIT_TEXT(int G[N+1][N+1])
- {
-
- G[1][2]=6;G[1][3]=4;G[1][4]=5;G[2][5]=1;G[3][5]=1;G[4][6]=2;
- G[5][7]=9;G[5][8]=7;G[6][8]=4;G[7][9]=2;G[8][9]=4;
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- int G[N+1][N+1]={-1};
- int P[N+1];
- int edges,x,y,value,pathsize;
- INIT_TEXT(G);
-
-
-
-
-
-
-
-
-
- if(!pivotalpath(G,P,pathsize)){cout<<"此有向图不存在关键路径!"<<endl;}
- else
- {
- cout<<"此有向图的关键路径节点序为"<<endl;
- for(int k=0;k<pathsize-1;k++)
- cout<<P[k]<<"->";
- cout<<P[pathsize-1]<<endl;
- }
- getchar();
- return 0;
- }
-