[数据结构] DS树+图综合练习--拓扑排序
DS树+图综合练习–拓扑排序
已知有向图,顶点从0开始编号,求它的求拓扑有序序列。 拓扑排序算法:给出有向图邻接矩阵 1.逐列扫描矩阵,找出入度为0且编号最小的顶点v 2.输出v,并标识v已访问 3.把矩阵第v行全清0 重复上述步骤,直到所有顶点输出为止
输入 第一行输入一个整数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 Visit[MaxLen]; int Matrix[MaxLen][MaxLen]; int Vexnum; int Select(); void Update(int sel); public: Map(){ } void SetMatrix(int vnum, int mx[MaxLen][MaxLen]); void TopoSort(); }; void Map::SetMatrix(int vnum, int mx[MaxLen][MaxLen]) { int i, j; Vexnum = vnum; for(i=0; i<MaxLen; i++) for(j=0; j<MaxLen; j++) Matrix[i][j] = 0; for(i=0; i<Vexnum; i++) for(j=0; j<Vexnum; j++) Matrix[i][j] = mx[i][j]; for(i=0; i<Vexnum; i++) Visit[i] = false; } void Map::TopoSort() { int i, j; int flag; for(i=0; i<Vexnum; i++) { int sel = Select(); cout<<sel<<" "; Update(sel); } cout<<endl; } int Map::Select() { int i, j; for(i=0; i<Vexnum; i++) { if(!Visit[i]) { for(j=0; j<Vexnum; j++) //判断该列是否全0,即入度为0 { if(Matrix[j][i]!=0) break; } if(j==Vexnum) { Visit[i] = true; //标记该点已访问 return i; //返回输出 } } } return -1; } void Map::Update(int sel) { int i; for(i=0; i<Vexnum; i++) { Matrix[sel][i] = 0; } } int main() { int t; cin>>t; while(t--) { Map test; int n; int mx[MaxLen][MaxLen]; cin>>n; for(int i=0; i<n; i++) for(int j=0; j<n; j++) cin>>mx[i][j]; test.SetMatrix(n, mx); test.TopoSort(); } return 0; }
下一篇:
用java输出九九乘法表