拓扑排序是图的算
法中经常碰到的一个算法,也经常用来判断图是否存在环等问题,算法的过程主要是:开始将所有入度为0的顶点进入一个阶列,将队列中的顶点出队列,即相当于
将该顶点从图中删除,同时删除与此顶点关联的边,删除边导致与顶点相关联的边的另一个顶点的入度减1,如果该同时入度又等于0,则将其放入队列中,循环下
去直至队列为空为止。循环开始前设置一个counter计数器,计算出队列的顶点数,如果循环结束后,出队列的顶点数不等于图的顶点的个数,那么即存在环。
在程序当前目录下建立graph.txt文件,写入下面内容,VC++ 6.0下程序运行通过。
v1 v2
v1 v3
v1 v4
v2 v4
v2 v5
v3 v6
v4 v3
v4 v6
v4 v7
v5 v4
v5 v7
v7 v6
}
if( ( v2_no=SearchVertex(g, v2) ) == -1 )
{
g->nodes[nodecount].val=v2;
g->nodes[nodecount].no=nodecount;
g->nodes[nodecount].firstEdge=NULL;
g->nodes[nodecount].degree=0;
v2_no=nodecount;
++nodecount;
g->n=nodecount;
}
g->nodes[v2_no].degree++;
Edge *e=new Edge; //将边插入对应的顶点的边链表
e->next=v2_no;
e->nextEdge=NULL;
Edge *p=g->nodes[v1_no].firstEdge;
Edge *q=NULL;
while( p != NULL )
{
q=p;
p=p->nextEdge;
}
if( q == NULL )
{
g->nodes[v1_no].firstEdge=e;
}
else
{
q->nextEdge=e;
}
}
/*
for( int i=0; i<g->n; ++i)
{
cout<<g->nodes[i].no<<'/t'<<g->nodes[i].val<<endl;
}
*/
Topsort(g);
for(int i=0; i<g->n; ++i) //释放边new出来的堆空间
{
Edge *pre, *cur;
cur=g->nodes[i].firstEdge;
pre=NULL;
while( cur != NULL )
{
pre=cur;
cur=cur->nextEdge;
delete pre;
}
}
delete g; //释放图new 出来的空间
return 0;
}