typedef struct FinishingTimeVex {
int time = 0;
int vex = 0;
};
void quickSort(FinishingTimeVex finishingTimeVex[], int start, int end) {
if (start >= end) return;
int i = start;
int j = end;
//int key = a[i];
int key = finishingTimeVex[i].time;
int keyIndex = finishingTimeVex[i].vex;
while (i < j)
{
//while (i < j && a[j] >= key)
while (i < j && finishingTimeVex[j].time <= key)
{
j--;
}
finishingTimeVex[i].vex = finishingTimeVex[j].vex;
finishingTimeVex[i].time = finishingTimeVex[j].time;
//while (i < j && a[i] <= key)
while (i < j && finishingTimeVex[i].time >= key)
{
i++;
}
finishingTimeVex[j].vex = finishingTimeVex[i].vex;
finishingTimeVex[j].time = finishingTimeVex[i].time;
}
finishingTimeVex[i].time = key;
finishingTimeVex[i].vex = keyIndex;
quickSort(finishingTimeVex, start, i - 1);
quickSort(finishingTimeVex, i + 1, end);
}
SqQueue topologicalSorting(ALGraph& g) {
SqQueue q;
initQueue(q);
DFSInfo dfsInfo = DFS(g);
ArcNode* p;
for (int u = 0; u < g.vexNum; u++)
{
p = g.vertice[u].firstarc;
while (p != NULL)
{
if (p->info == 1)
{
cout << " 图中存在回路! ";
return q;
}
p = p->nextArc;
}
}
FinishingTimeVex finishingTimeVex[MAX_VERTEX_NUM]; // finishingTimeVex.vex 按照结束时间从大到小存储结点
// 即ordInv
for (int u = 0; u < g.vexNum; u++)
{
finishingTimeVex[u].vex = u;
finishingTimeVex[u].time = dfsInfo.f[u];
}
quickSort(finishingTimeVex, 0, g.vexNum - 1);
for (int i = 0; i < g.vexNum; i++)
{
enQueue(q, finishingTimeVex[i].vex); // insert vextex into list
}
return q;
}
Topological Sort
最新推荐文章于 2024-10-10 22:59:02 发布
文章介绍了如何使用`FinishingTimeVex`结构存储有向图中节点的结束时间,并借助快速排序算法对这些时间进行排序,以实现拓扑排序,检测图中是否存在回路。
摘要由CSDN通过智能技术生成