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