|
AOE算法应用和实现思路讲解可以参见其他数据结构教材或者网上相关博客文章,在这里,我就具体针对代码讲解具体含义:
首先是类头文件:
#pragma once
#define maxsize 100
#define MAX 999999999
class graph
{
public:
int possize;
int store[maxsize][maxsize];
graph(void);
~graph(void);
void graphin();
bool aoe();
void findway(int *ve,int *vl,int cur);
};
然后是类实现的源文件:
#include "StdAfx.h"
#include "graph.h"
#include <iostream>
using namespace std;
graph::graph(void)
{
possize=0;
int i,j;
for(i=0;i<maxsize;i++)
{
for(j=0;j<maxsize;j++)
{
if(i==j)
store[i][j]=0;
else
store[i][j]=MAX;
}
}
}
graph::~graph(void)
{
}
void graph::graphin()
{
cout<<"(提示语)请输入所有带权有向边,如<V1,V2>9,结束请输入end"<<endl;
char str[100]={'\0'};
bool used[maxsize];
int i;
for(i=0;i<maxsize;i++)
{
used[i]=false;
}
possize=0;
while(cin>>str)
{
if(str[2]=='d')
{
break;
}
else
{
i=0;
int head=0,tail=0,weight=0;
while(str[i]<'0'||str[i]>'9')
i++;
while(str[i]>='0'&&str[i]<='9')
{
head=head*10+str[i]-'0';
i++;
}
while(str[i]<'0'||str[i]>'9')
i++;
while(str[i]>='0'&&str[i]<='9')
{
tail=tail*10+str[i]-'0';
i++;
}
while(str[i]<'0'||str[i]>'9')
i++;
while(str[i]>='0'&&str[i]<='9')
{
weight=weight*10+str[i]-'0';
i++;
}
store[head][tail]=weight;
used[head]=true;
used[tail]=true;
}
}
for(i=1;i<=maxsize;i++)
{
if(used[i]==true) possize++;
}
}
bool graph::aoe()
{
int goin[maxsize];
int stack[maxsize];
int ve[maxsize];
int vl[maxsize];
int n=possize;
int top=0;
int i,j,k,t;
for(i=0;i<maxsize;i++)
{
goin[i]=0;
stack[i]=0;
ve[i]=0;
vl[i]=0;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(store[i][j]>0&&store[i][j]<MAX)
goin[j]++;
}
}
for(i=1;i<=n;i++)
{
j=1;
while(goin[j]!=0)
{
j++;
if(j>n) return false;
}
stack[i]=j;
top++;
for(k=1;k<=top;k++)
{
if(store[stack[k]][j]>0&&store[stack[k]][j]<MAX)
{
if(ve[j]<ve[stack[k]]+store[stack[k]][j])
{
ve[j]=ve[stack[k]]+store[stack[k]][j];
}
}
}
for(k=1;k<=n;k++)
{
if(store[j][k]>0&&store[j][k]<MAX)
goin[k]--;
}
goin[j]=-1;
}
vl[stack[n]]=ve[stack[n]];
for(i=1;i<=n;i++)
vl[i]=ve[stack[n]];
for(t=top;t>0;t--)
for(k=t;k<=top;k++)
{
if(store[stack[t]][stack[k]]<MAX&&store[stack[t]][stack[k]]>0)
{
if(vl[stack[t]]>vl[stack[k]]-store[stack[t]][stack[k]])
{
vl[stack[t]]=vl[stack[k]]-store[stack[t]][stack[k]];
}
}
}
cout<<"关键路径:"<<endl;
findway(ve,vl,1);
cout<<"关键活动:"<<endl;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(store[i][j]>0&&store[i][j]<MAX)
{
if(ve[i]==vl[i]&&ve[j]==vl[j])
cout<<"<V"<<i<<",V"<<j<<'>'<<endl;
}
}
}
cout<<endl;
return true;
}
void graph::findway(int *ve,int *vl,int cur)
{
if(cur==possize)
{
cout<<"V"<<cur<<endl;
}
int i;
for(i=1;i<=possize;i++)
{
if(ve[i]==vl[i]&&(store[cur][i]>0&&store[cur][i]<MAX))
{
cout<<'V'<<cur<<'-';
findway(ve,vl,i);
}
}
}
最后是测试程序(文末附上测试输入样例):
#include "stdafx.h"
#include "graph.h"
#include <iostream>
#include <cstdio>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
graph test;
test.graphin();
if(test.aoe()){}
system("pause");
return 0;
}
|