对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序的序列,简称拓扑序列。
拓扑排序算法主要是循环执行以下两步,直到不存在入度为0的顶点为止。
(1) 找到一个入度为0的顶点并输出之;
(2) 从图中删除此顶点及所有出边;
循环结束后,若输出的顶点数小于图中的顶点数,则证明有回路(故可判断图中是否存在回路),否则输出的顶点序列就是一种拓扑序列。
1.储存图
bool map[502][502];
int ru[502];
memset(map, 0, sizeof(map));
memset(ru, 0, sizeof(ru));
for (i = 1; i <= m; i++)
{
scanf("%d %d", &a, &b);
if (map[a][b] == 0)//处理重边的情况
{
map[a][b] = 1;
ru[b]++;//记录点的入度
}
}
2.进行排序
void Topological(int n,int m)
{
int i, j,k,p,l;
l = 1;
for (i = 1; i <= n ; i++)
{
for (j = 1; j <= n; j++)//遍历所有的点找出入度为0的点
{
if (ru[j] == 0)
{
printf("%d%c", j, i == n ? '\n' : ' ');//输出结果
ru[j]--;//令ru[j]=-1
k = j;//记录j
break;
}
}
for (p = 1; p <= n; p++)
{
if (map[k][p] == 1)
{
map[k][p] = 0;//删除以K为顶点的所有的边
ru[p]--;
}
}
}
}