拓扑排序

来源:互联网 发布:杭州行知小学分校 编辑:程序博客网 时间:2024/06/06 15:33

1、问题描述

已知有向图,顶点从0开始编号,求它的求拓扑有序序列。

 2、拓扑排序算法:给出有向图邻接矩阵

(1)逐列扫描矩阵,找出入度为0且编号最小的顶点v

(2)输出v,并标识v已访问

(3)把矩阵第v行全清0

重复上述步骤,直到所有顶点输出为止

 3、输入

第一行输入一个整数t,表示有t个有向图

第二行输入n,表示图有n个顶点

第三行起,输入n行整数,表示图对应的邻接矩阵

以此类推输入下一个图的顶点数和邻接矩阵

 4、输出

每行输出一个图的拓扑有序序列

 5、样本输入

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

 6、样本输出

0 1 3 2 4

4 6 5 1 3 2 0 

#include <iostream>
using namespace std;
const int MAX_VERT = 10;
struct Graphic{
int vertNum;
int VertValue[MAX_VERT];
int AdjMatrix[MAX_VERT][MAX_VERT];
bool visited[MAX_VERT];
};
void initGraphic(Graphic &G, int n){
G.vertNum = n;
int i, j;
for(i = 0; i < G.vertNum; i++){
for(j = 0; j < G.vertNum; j++)
cin>>G.AdjMatrix[i][j];
}
for(i = 0; i< G.vertNum; i++){
G.VertValue[i] = i;
G.visited[i] = false;
}
}
void TopoSort(Graphic G){

int i, j, k, m;

//顶点个数循环

for(m = 0; m <G.vertNum; m++){

//行坐标循环

for(i = 0; i < G.vertNum; i++){

//列坐标循环

for(j = 0; j < G.vertNum; j++){

//按列查找取得的值是否为1,如果为1跳出循环

if(G.AdjMatrix[j][i])
break;

}

//判断第i个顶点是否被访问过,如果未访问过跳出循环并且 遍历所有列

if(j == G.vertNum && !G.visited[i])
break;

}

//输出计算出的顶点

cout<<i<<" ";

for(k = 0; k <G.vertNum; k++)

//第i行全部清0

G.AdjMatrix[i][k] = 0;

//标记第i个顶点已被访问过

G.visited[i] = true;
}
cout<<endl;
}
int main()
{
int t, n, i;
Graphic G[2];
cin>>t;
for(i = 0; i < t; i++){

cin>>n;

initGraphic(G[i], n);

TopoSort(G[i]);
}

return 0;
}
0 0
原创粉丝点击