拓扑排序
来源:互联网 发布:小米怎么看网络制式 编辑:程序博客网 时间:2024/05/17 22:18
【定义】
拓扑排序,适用于有向无环图(AOV网)。
把 AOV 网中所有的活动排成一个序列,使每个活动的所有前驱活动都排在该活动之前,这个过程就是“拓扑排序”,所得到的序列就是拓扑序列。
【算法思想】
(1)选择一个入度为0的定点输出。
(2)然后把删除以此节点为起点的所有关联边。转(1),直到不存在入度为0的节点。
(3)假如输出的顶点数小于AOV网的顶点,则有回路。
我们可以用邻接矩阵来删除所有的关联边,用栈来控制拓扑序列。【程序】
# include <cstdio>
using namespace std;
int n,j,i,tot=0,tmp=0,num=0;
int r[101]; //入度
int c[101]; //出度
int a[101][101]; //邻接矩阵
int ans[101]; //栈
int main()
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
do{
scanf("%d",&j);
if(j!=0)
{
c[i]++; //点 i 的出度
a[i][c[i]]=j;
r[j]++; // 点 i 的入度
}
}while(j!=0);
}
for(i=1;i<=n;i++)
if(r[i]==0) ans[++tot]=i;//把AOV网中所有度为 0 的节点入栈
do{
tmp=ans[tot];
printf("%d ",tmp);
tot--; num++;//出栈并输出
for(i=1;i<=c[tmp];i++)
{
r[a[tmp][i]]--;//删除所有关联边
if(r[a[tmp][i]]==0) ans[++tot]=a[tmp][i];//如果入度减1为0,则入栈
}
}while(num!=n);//如果输出的点的数目等于AOV网的顶点数,就结束
return 0;
}
0 0
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 【拓扑排序】
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 拓扑排序
- 198. House Robber
- 视图控制器ViewControllers之间的数据传递
- cocos2dx lua 安卓接付费SDK
- Spring MVC之——前后台传值
- 最小生成树
- 拓扑排序
- Noip2015普及组第四题 Salesman的解题报告
- Android 中的 Service 全面总结
- 最短路径(未完成)
- 树状数组
- 线段树
- 最长不下降子序列
- iOS Keychain (钥匙串)简单封装
- 欢迎使用CSDN-markdown编辑器