拓扑排序
来源:互联网 发布:杭州行知小学分校 编辑:程序博客网 时间: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;
}
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 【拓扑排序】
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- oAuth2.0协议简单说明
- HTML DOM学习总结
- shell awk
- 如何监控进程的内存使用情况(AIX)
- Warning: Attempt to present A on B whose view is not in the window hierarchy!
- 拓扑排序
- Nginx中发送udp请求
- netstat -apn密令中IP地址的含义
- Spring的IOC(控制反转)和 DI(依赖注入)机制
- Mac osx 10.10系统下MySQL-Python的配置
- centos下安装setuptools
- The server does not support version 3.0 of the J2EE Web module specification
- 小明A+B
- align与text-align