- 拓扑排序就是对某些点不停加边,然后再以每个点的度来寻找答案,每次找到入度为零的点,就把与之相关的点的入度减去一,直到没有点的入度大于零
- 一种简单的拓扑:
<span style="font-size:18px;">bool TopologicalSort(int a[][101]) //可以完成拓扑排序则返回True { int n=a[0][0],i,j,into[101]={0},ans[101]={0};//初始化为零,其实这里的n就是点的个数 for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(a[i][j]>0)//把后面的点的度叠加 into[j]++; into[0]=1; for(i=1;i<=n;i++) { j=0; while(into[j]!=0)//找出度为零的点 { j++; if(j>n)//出现这种情况说明有环 return false; } ans[i]=j;//记录答案 into[j]=-1;//将入度为零且找到过的点标记为-1 for(int k=1;k<=n;k++)//把与找到的入度为零的点的相关点间的线去点 if(a[j][k]>0) into[k]--; } return true; } </span>
还可以用栈,队列等来实现,这就要看具体情况分析- 简单的队列用法:
<span style="font-size:18px;">for(i=1;i<=n;i++) if(du[i]==0) q.push(i);//入度为零的入队 int k=0; while(!q.empty()) { int num=q.top(); q.pop(); k++; sum[k]=num; for(i=1;i<=n;i++) { if(edge[num][i]==1)//把与num相关的连线去掉 { du[i]--; if(du[i]==0) q.push(i); } } }</span>
当然我们知道邻接矩阵空间浪费很大,而且不能去重边,我们可以考虑用邻接表<span style="font-size:18px;"> vector<int>edge[]; for(i=1;i<=n;i++) if(du[i]==0) q.push(i);//入度为零的入队 int k=0; while(!q.empty()) { int num=q.top(); q.pop(); k++; sum[k]=num;//记录答案 for(int j=0;j<edge[num].size();j++)//用邻接表来去除相关连接点的度 { int val=edge[num][j]; dis[val]--; if(dis[val]==0) q.push(val); } }</span>
图论之拓扑排序
最新推荐文章于 2022-03-24 19:36:17 发布