template<class EdgeType>
bool AdjGraph<EdgeType>::TopologySort(int SortArray[100])//对有向图进行拓扑排序,将序列存放在数组SortArray中
{
int n=vertexNum;
int *indegree=new int[n];//创建一个数组记录各个顶点的入度
int v;
for(v=0;v<n;v++)//各个顶点的入度初始化为0,访问状态标记为未访问
{
indegree[v]=0;
Mark[v]=0;
}
for(v=0;v<n;v++)//统计各个顶点的入度信息
{
for(int i=0;i<n;i++)
{
if(matrix[v][i]!=1000)
indegree[i]++;
}
}
for(int i=0;i<n;i++)//依次确定拓扑序列SortArray中的第i个元素,找到入度为0且未被访问的顶点
{
for(v=0;v<n;v++)
{
if(indegree[v]==0 && Mark[v]==0)
{
break;//退出for(v)循环
}
}
if(v==n)//找不到入度为0的顶点,退出拓扑排序
{
cout<<"有向图中存在环,该图没有拓扑排序"<<endl;
cout<<"环中的元素有:"<<endl;
for(int i=0;i<n;i++)
{
if(Mark[i]==0)
cout<<"点"<<i<<"在环中"<<endl;
}
return false;
}
Mark[v]=1;//将顶点v放到排序序列中,并将其状态设置为VISITED
SortArray[i]=v;
for(int i=0;i<n;i++)
{
if(matrix[v][i]!=1000)
indegree[i]--;
}
}
for(int i=0;i<n;i++)
{
cout<<"第"<<i<<"个点为"<<SortArray[i]<<endl;
}
delete []indegree;
return true;
}
bool AdjGraph<EdgeType>::TopologySort(int SortArray[100])//对有向图进行拓扑排序,将序列存放在数组SortArray中
{
int n=vertexNum;
int *indegree=new int[n];//创建一个数组记录各个顶点的入度
int v;
for(v=0;v<n;v++)//各个顶点的入度初始化为0,访问状态标记为未访问
{
indegree[v]=0;
Mark[v]=0;
}
for(v=0;v<n;v++)//统计各个顶点的入度信息
{
for(int i=0;i<n;i++)
{
if(matrix[v][i]!=1000)
indegree[i]++;
}
}
for(int i=0;i<n;i++)//依次确定拓扑序列SortArray中的第i个元素,找到入度为0且未被访问的顶点
{
for(v=0;v<n;v++)
{
if(indegree[v]==0 && Mark[v]==0)
{
break;//退出for(v)循环
}
}
if(v==n)//找不到入度为0的顶点,退出拓扑排序
{
cout<<"有向图中存在环,该图没有拓扑排序"<<endl;
cout<<"环中的元素有:"<<endl;
for(int i=0;i<n;i++)
{
if(Mark[i]==0)
cout<<"点"<<i<<"在环中"<<endl;
}
return false;
}
Mark[v]=1;//将顶点v放到排序序列中,并将其状态设置为VISITED
SortArray[i]=v;
for(int i=0;i<n;i++)
{
if(matrix[v][i]!=1000)
indegree[i]--;
}
}
for(int i=0;i<n;i++)
{
cout<<"第"<<i<<"个点为"<<SortArray[i]<<endl;
}
delete []indegree;
return true;
}