拓扑排序:对于有向无环图的排序,对于一个有向无环图来说,拓扑排序就是讲该图中的所有定点排成一个线性顺序。使得途中任意一对定点u和v,若存在边<u,v>关系,u在v之前。
实现思路:
1:从图中选择一个入度为0的顶点,并输出他
2:从图中删除该点,并且删除该定点出发的所有有向边
3:重复上述两步
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N = 100005;
const int M = 100005;
struct EdgeNode{
int to;
int w;
int next;
};
EdgeNode edge[N];
int head[M];
int n,m;
int indegree[N];
void toposort(){
int queue[N];
int iq = 0 ;
for(int i = 1 ; i <= n ; i++){
if(indegree[i] == 0){
queue[iq++] = i;
}
}
for(int i = 0 ; i < iq ; i++){
for(int k = head[queue[i]] ; k != -1 ; k = edge[k].next){
indegree[edge[k].to] -- ;
if(indegree[edge[k].to] == 0){
queue[iq++] = edge[k].to;
}
}
}
for(int i = 0 ; i < iq; i ++)
cout << queue[i] << " ";
cout << endl;
}
int main(){
memset(head,-1,sizeof(head));
memset(indegree,0,sizeof(indegree));
cin >> n >> m;
for(int i = 1 ; i <= m; i ++){
int a,b,c;
cin >> a >> b;
edge[i].to = b;
edge[i].w = c;
edge[i].next = head[a];
head[a] = i;
indegree[b] ++;
}
// for(int i = 1; i <= n ; i++){
// for(int k = head[i] ; k != -1 ; k = edge[k].next){
// cout << i << " " << edge[k].to << " " << edge[k].w << endl;
// }
// }
toposort();
return 0 ;
}
/*
5 5
5 4
1 2
2 3
1 3
1 5
*/
本文详细介绍了拓扑排序算法的概念及其实现思路,通过具体的代码示例展示了如何对有向无环图进行排序,确保图中任意一条有向边的起点在终点之前。
&spm=1001.2101.3001.5002&articleId=78457940&d=1&t=3&u=e9880e30c5a54e19b108518cd96289d4)
944

被折叠的 条评论
为什么被折叠?



