zoukankan      html  css  js  c++  java
  • 关键路径(AOE)---《数据结构》严蔚敏

    // 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,0,sizeof(int)*(G.vexnum+1));
    	G.ve=(int*)malloc(sizeof(int)*(G.vexnum+1));
    	memset(G.ve,0,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,0,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;
    }
    

  • 相关阅读:
    结构型模式代理&适配器
    创建型模式单例&工厂&建造者&原型
    结构型模式装饰者&桥接&门面
    python中列表(list)的使用
    Win2003 域控制器设置和客户端安装
    Python下冒泡排序的实现
    乔布斯在斯坦福大学毕业典礼上的演讲
    字符串替换
    统计文件中某一字符串出现的次数
    [用户 'sa' 登录失败。原因: 该帐户被禁用]的解决方案
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6900398.html
Copyright © 2011-2022 走看看