借助STL中堆栈容器实现的拓扑排序算法简洁明了,这里关键是要用一个辅助数组来统计有向图中每一个结点的入度;
具体代码如下:
#include<stdio.h>
#include<vector>//向量容器
#include<stack>//堆栈容器
#define MAX 100000
using namespace std;
char point[MAX];//存储图结点
vector<int>map[MAX];//邻接表存储有向图结构
int in_degree[MAX];//存储有向图各结点的入度
int Topologicalsort(int n){
//对含有n个顶点的有向图进行拓扑排序,若排序成功返回1,否则返回0
stack<int>s;
int count=0,i,t;
for(i=0;i<n;i++)
{
if(!in_degree[i])
s.push(i);//入度为零则进栈
}//for
while(!s.empty())
{
t=s.top();//读取栈顶元素
printf("%c",point[t]);
count++;
s.pop();
for(i=0;i<map[t].size();i++)
{
if(!(--in_degree[map[t][i]]))/
s.push(map[t][i]);//与t结点相邻的结点入度减一后如果为零则进栈
}//for
}//while
if(count==n)return 1;
return 0;
}
int main()
{
int n,m,i,a,b;
printf("请输入图结点数与边数:\n");
scanf("%d %d",&n,&m);
getchar();
scanf("%s",point);
for(i=0;i<MAX;i++)
map[i].clear();//清空行链表
memset(in_degree,0,sizeof(in_degree));//初始化入度为零
for(i=1;i<=m;i++)
{
scanf("%d %d",&a,&b);//读取有向图中的边
map[a].push_back(b);
//printf("%d",map[a][b]);
in_degree[b]++;//读取边的同时统计b点入度
}
if(Topologicalsort(n))
printf("有向无环图:\n");
else printf("该有向图存在环:\n");
system("pause");
return 0;
}