拓扑排序_基于邻接矩阵
来源:互联网 发布:匡恩网络 工控安全 编辑:程序博客网 时间:2024/04/24 01:47
人们用一种有向图来表示这些工程、计划等,在这种有向图中,顶点表示活动,有向边表示活动的优先关系,这种用顶点表示活动,用弧来表示活动间的优先关系的有向图叫做顶点表示活动的网络(Actire On Vertices)简称为AOV网。在AOV网中不应该出现有向环。 通常,在AOV网中,将所有活动排列成一个拓扑序列的过程叫做拓扑排序(Topological Sort)。 、、从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它。//算法描述// 0度结点的权为0// 核心:假设有a->b(b的权=b的权+a的权+1) // 具体实现有:假设有 b->c;b->d;b->e;结点cde进入队列// 权越小排序越靠前////在编写的代码的过程中,犯了个大错误//void shenqing(int **&T,int* &dui);//申请动态空间,错误:没有使用引用;导致申请的空间无效
测试数据6 80 10 20 32 42 13 45 35 4#include <iostream>#include <stdio.h>#include <stdlib.h>using namespace std; int v;//////点数目 int edge;///边数目 int dui_front=0;//队头 int dui_rear=0;//队尾//////头有数据,尾无数据int** draw();//绘图,有向无环图void shenqing(int **&T,int* &dui);//申请动态空间void tuopusort(int** a,int** T,int* dui);//拓扑排序void SelectSort(int **arr,int length);int main(int argc, char const *argv[]) { int**a=draw();//图 int **T;//存放点以及其对应的权,T是n行2列的数组,它的第二列放的权 int* dui;//队列 shenqing(T,dui); tuopusort(a,T,dui); SelectSort(T,v); for (int i = 0; i < v; ++i) { cout<<T[i][0]<<" "<<T[i][1]<<endl; }//------------------------------------------------------------------------// //释放空间 delete []a; delete []T; delete []dui; return 0; } int** draw()//绘图 { int i,j; cin>>v>>edge;///输入点数目和边数目 int **a=new int*[v]; for ( i = 0; i < v; ++i) a[i]=new int[v]; for ( i = 0; i < v; ++i) for ( j = 0; j < v; ++j) a[i][j]=0; int spot1,spot2; for ( i = 0; i < edge; ++i) { cin>>spot1>>spot2; a[spot1][spot2]=1; } ///-------------------------------------------------------------/// cout<<"\n"; for ( i = 0; i < v; ++i) { for ( j = 0; j < v; ++j) { cout<<a[i][j]<<" "; } cout<<"\n"; } cout<<"\n"; return a; } void shenqing(int **&T,int* &dui)//引用{ int i; T=new int*[v]; for ( i = 0; i < v; ++i) T[i]=new int[2]; for ( i = 0; i < v; ++i) { T[i][0]=i; T[i][1]=0; } dui=new int[v];}void tuopusort(int** a,int** T,int* dui){ int i,j,temp;//----------------------------------------------------// ////获取0入度结点,放入队列中 int panduan=0; for ( i = 0; i < v; ++i) { for ( j = 0; j < v; ++j)//计算列 { if(a[j][i]==1)panduan=1; } if (panduan==0)//0入度的结点 { temp=dui_rear++ % v; dui[temp]=i; } panduan=0; }//----------------------------------------------------// if (dui_front==dui_rear)///无0入度的结点,及有环 { cout<<"有环"; exit(1); }//----------------------------------------------------// int tempdui; while(true) { tempdui = dui[dui_front++ % v]; for ( i = 0; i < v; ++i) { if (a[tempdui][i]==1) { T[i][1] += T[tempdui][1] +1; for ( j = dui_front; j < dui_rear; ++j) if (i==j)continue;//已经存在结点i了,不能再次加进去了 dui[dui_rear++ % v]=i; } } if (dui_front==dui_rear) break;//处理完毕 }}void SelectSort(int **arr,int length){ int min,temp,temp2; for(int i=0;i<length-1;i++) { min=i; for(int j=i+1;j<length;j++) { if(arr[min][1]>arr[j][1]) min=j; } if(i<min)/////////下面的三条语句实现交换 { temp=arr[i][0]; temp2=arr[i][1]; arr[i][0]=arr[min][0]; arr[i][1]=arr[min][1]; arr[min][0]=temp; arr[min][1]=temp2; } }}
0 0
- 拓扑排序_基于邻接矩阵
- 拓扑排序(邻接矩阵)
- 拓扑排序-邻接矩阵表示
- Java实现拓扑排序:基于邻接矩阵,针对有向无环图
- 有向图的拓扑排序——基于邻接矩阵
- 拓扑排序_基于邻接表
- 邻接矩阵实现的拓扑排序
- 关于邻接矩阵的拓扑排序
- 拓扑排序基本介绍(拓扑排序邻接矩阵模板)
- 图的邻接矩阵实现拓扑排序
- hdu3342 Legal or Not (拓扑排序+邻接矩阵)
- 【算法导论】邻接矩阵存储的拓扑排序
- 图的邻接矩阵表示和拓扑排序
- hdu1285 拓扑排序+邻接矩阵(邻接表)
- hdu1285(邻接矩阵写拓扑排序)
- 拓扑排序(C语言 邻接矩阵存储)
- hdu_1285_拓扑排序_
- 拓扑排序 基于DFS
- .NET中验证域用户名以及密码的方式
- sql常用查询语句
- Advantages of aluminium lighting poles
- UDP P2P NAT详解
- .NET在域里出现无权限访问asp
- 拓扑排序_基于邻接矩阵
- 数据流挖掘的例子
- .net 域用户 信息
- 在1×2×3×...×100的积中,从右边数第25个数字是几
- UVa 537 - Artificial Intelligence?解题报告
- 【LeetCode】Letter Combinations of a Phone Number
- C++标准库
- 根据url下载音乐
- 计算传递闭包