//拓扑排序是对有向无圈图的顶点的一种排序
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
#define MAXN 1000
struct edge{
int next;
int to;
}edges[MAXN];
int head[MAXN];
int n,m,cnt;
void Init(){
for(int i=1;i<=m;i++)
edges[i].next=0;
for(int i=1;i<=n;i++)
head[i]=0;
return;
}
void Add(int x,int y){
cnt++;
edges[cnt].to=y;
edges[cnt].next=head[x];
head[x]=cnt;
}
void TopSort(){
int t;
queue<int>Q;
int inDegree[MAXN];
memset(inDegree,0,sizeof(inDegree));
for(int i=1;i<=n;i++){
for(int j=head[i];j;j=edges[j].next){
inDegree[edges[j].to]++;
}
}
for(int i=1;i<=n;i++){
if(!inDegree[i]){
Q.push(i);
}
}
while(!Q.empty()){
t=Q.front();
printf("%d ",t);
Q.pop();
for(int i=head[t];i;i=edges[i].next){
if(--inDegree[edges[i].to]==0){
Q.push(edges[i].to);
}
}
}
return;
}
int main(){
int x,y;
while(cin>>n>>m){
cnt=0;
Init();
for(int i=1;i<=m;i++){
cin>>x>>y;
Add(x,y);
}
TopSort();
}
return 0;
}
拓扑排序
最新推荐文章于 2025-05-13 21:35:52 发布