拓扑排序(链式前向星+队列实现)

来源:互联网 发布:手机淘宝兼职客服招聘 编辑:程序博客网 时间:2024/06/02 05:15

拓扑排序:对于有向无环图的排序,对于一个有向无环图来说,拓扑排序就是讲该图中的所有定点排成一个线性顺序。使得途中任意一对定点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 55 4 1 2 2 3 1 3 1 5*/

原创粉丝点击