PTA–6-2-三选一 Is Topological Order (25 分)
题目如下图片
:
题目本身的 意思很简单,就是传进来一个数组判断这个数组里面的数字能否构成一个拓扑序列
思路也很简单: 将传进来的数组用一个队列保存,然后依次出队,出队的顶点必定是 入度为0的顶点,若入度不为0,直接返回false。 队列空了之后 还没有返回 false 就说明 能够构成 一个拓扑序列。
但是 这题有坑!
题目有说明:
Note: Although the vertices are numbered from 1 to MaxVertexNum, they are indexed from 0 in the LGraph structure.
意思就是 输入的顶点是从 0 开始存放的
例如: 1 被放在 0 位置, 2 被放在 1位置, 3被放在 2 位置… i 被放在 i-1 个位置上。
题解代码如下:
bool IsTopSeq(LGraph Graph, Vertex Seq[]) //思路简单,用一个队列来处理,但是题目有坑
{
// 题目测试数据最多 只有 1000 个 ,所以数组直接开1000,不然会段错误。
PtrToAdjVNode p;
int i, qu[1000], rear = -1, w, front = -1;
int count[1000];
for (i = 0; i<Graph->Nv+1; i++)
count[i] = 0;
for (i = 0; i<Graph->Nv; i++)
{
p = Graph->G[i].FirstEdge;
while (p)
{
count[p->AdjV]++;
p = p->Next;
}
}
// 题目中隐藏的大坑:
// 顶点是从 0 开始存放的 比如; 1被放在 0, 2 被放在 1,i 被放在 i-1 个位置上面
// 所以 传进来的数组 Seq[i] = Seq[i] -1; 大坑一个
for (i = 0; i<Graph->Nv; i++)
qu[++rear] = Seq[i]-1; //按照传进来的拓扑序列依次进队
while (front != rear)
{
w = qu[++front]; //出队
if (count[w] != 0) return false; //出队的一定是入度为 0 的顶点,否则返回false;
p = Graph->G[w].FirstEdge;
while (p)
{
count[p->AdjV]--;
if (count[p->AdjV]<0) return false;
p = p->Next;
}
}
return true;
}