目录
题目描述
已知有向图,顶点从0开始编号,求它的求拓扑有序序列。
拓扑排序算法:给出有向图邻接矩阵
1.逐列扫描矩阵,找出入度为0且编号最小的顶点v
2.输出v,并标识v已访问
3.把矩阵第v行全清0
重复上述步骤,直到所有顶点输出为止
--程序要求--
若使用C++只能include一个头文件iostream;若使用C语言只能include一个头文件stdio
不允许使用第三方对象或函数实现本题的要求
输入
第一行输入一个整数t,表示有t个有向图
第二行输入n,表示图有n个顶点
第三行起,输入n行整数,表示图对应的邻接矩阵
以此类推输入下一个图的顶点数和邻接矩阵
输出
每行输出一个图的拓扑有序序列
输入样例
2
5
0 1 0 1 1
0 0 1 0 0
0 0 0 0 1
0 0 1 0 0
0 0 0 0 0
7
0 0 0 0 0 0 0
1 0 1 1 0 0 0
1 0 0 0 0 0 0
1 0 1 0 0 0 0
0 0 0 0 0 1 1
0 1 0 0 0 0 0
0 0 0 1 0 1 0
输出样例
0 1 3 2 4
4 6 5 1 3 2 0
#include <iostream>
using namespace std;
const int MaxLen = 20;
class Map{
private:
bool isFinished[MaxLen];
int Matrix[MaxLen][MaxLen];
int Vexnum;
public:
void SetMatrix(int vnum, int mx[MaxLen][MaxLen])
{
for(int i = 0; i < MaxLen; i++)
isFinished[i] = false;
Vexnum = vnum;
for(int i = 0; i < MaxLen; i++)
for(int j = 0; j < MaxLen; j++)
Matrix[i][j] = 9999;
for(int i = 0; i < Vexnum; i++)
for(int j = 0; j < Vexnum; j++)
Matrix[i][j] = mx[i][j];
}
bool isZeroInDegrees(int vertexNo)
{
int i = 0;
for(; i < Vexnum && Matrix[i][vertexNo] == 0; i++);
if(i == Vexnum)
return false;
else
return true;
}
int select()
{
int i = 0;
for(; i < Vexnum; i++)
{
if(isFinished[i])
continue;
if(isZeroInDegrees(i))
continue;
isFinished[i] = true;
return i;
}
return -1;
}
void update(int rootNo)
{
int j = 0;
for(; j < Vexnum; j++)
{
Matrix[rootNo][j] = 0;
}
}
void topologySort()
{
int i = 0;
for(; i < Vexnum; i++)
{
int root;
root = select();
if(root == -1)
break;
update(root);
cout<<root<<" ";
}
cout<<endl;
}
};
int main()
{
int t;
int mx[MaxLen][MaxLen];
int vnum;
cin>>t;
while(t--)
{
for(int i = 0; i < MaxLen; i++)
for(int j = 0; j < MaxLen; j++)
mx[i][j] = 0;
cin>>vnum;
for(int i = 0; i < vnum; i++)
for(int j = 0; j < vnum; j++)
cin>>mx[i][j];
Map myMap;
myMap.SetMatrix(vnum, mx);
myMap.topologySort();
}
return 0;
}