拓扑排序之变量序列算法分析(二)

2014-11-23 17:40:18 · 作者: · 浏览: 32
功能:把顶点和边信息读入到表示图的边表集中

输入变量:char*data:存储了N个关系式的字符串

int In[]:存储了顶点的入度信息

int first[]:指向以该顶点为弧尾的第一条边

EdgeLib edge[]:存储了边信息的边表集

输出变量:表示图的边表集数组

返回值:int :顶点数量

*/

int CreateGraph_2(char *data, int In[], intfirst[], EdgeLib edge[])//创建一个图

{

inti, j;

intcount = 0;//记录顶点数量

for(i=0; i

{

first[i]= -1;

book[i]= 0;

In[i]= 0;

}

for(j=i=0; data[i]!='\0'; i+=2,j++)//每次读取两个变量

{

edge[j].u= data[i] - 'a'; //字母转换为数字,'a'对应0,'b'对应1,以此类推

edge[j].v= data[i+1] - 'a';

book[edge[j].u]= book[edge[j].v] = 1;

edge[j].next= first[edge[j].u];

first[edge[j].u]= j;

In[edge[j].v]++;

}

for(i=0; i

{

if(book[i] != 0)

count++;

}

returncount;

}

/*

函数名称:TopoLogicalSort

函数功能:拓扑排序,采用广度优先搜索获取拓扑序列

输入变量:char*topo:用来存储拓扑序列的字符串

EdgeLib edge[]:存储了边信息的边表集

int In[]:存储了顶点的入度信息

int first[]:指向以该顶点为弧尾的第一条边

int n:顶点个数

输出变量:用来存储拓扑序列的字符串

返回值:int :拓扑排序成功返回真,若存在环则返回假

*/

int TopoLogicalSort(char *topo, EdgeLibedge[], int In[], int first[], int n)

{

inti, u, front, rear;

front= rear = 0;

for(i=0; i

{

if(book[i] != 0 && In[i] == 0)

{

topo[rear++]= i + 'a';

}

}

while(front < rear)//采用广度优先搜索获取拓扑序列

{

u= topo[front++] - 'a';

for(i=first[u]; i!=-1; i=edge[i].next)

{

if(--In[edge[i].v] == 0)

topo[rear++]= edge[i].v + 'a';

}

}

topo[rear]= '\0';

return(rear == n);//如果count小于顶点数,说明存在环

}

这里只给出了相关函数,完整的测试代码请到巧若拙的博客(http://blog.csdn.net/qiaoruozhuo)查看。