第一次拓扑排序。
代码:
#include<stdio.h>
#include<string.h>
const int maxn = 505;
struct T{
int u;
int v;
int next;
}edge[maxn];
int n , m , e , tot;
int head[maxn] , in[maxn] , vis[maxn];
void init(){
e = 0;
memset(head , -1 , sizeof(head));
memset(in , 0 , sizeof(in));
memset(vis , -1 , sizeof(vis));
return ;
}
void addedge(int u , int v){
edge[e].u = u;
edge[e].v = v;
edge[e].next = head[u];
head[u] = e++;
return ;
}
void topsort(){
bool flag;
while(1){
flag = false;
for(int i = 1 ; i <= n ; i ++){
if(in[i] == 0 && vis[i] == -1){
flag = true;
vis[i] = 1;
for(int j = head[i] ; j != -1 ; j = edge[j].next){
in[edge[j].v] --;
}
if(tot == 0) printf("%d" , i);
else printf(" %d" , i);
tot ++;
break;
}
}
if(flag == false) break;
}
return ;
}
int main(){
int a , b;
bool flag = true;
while(~scanf("%d%d" , &n , &m)){
init();
tot = 0;
for(int i = 1 ; i <= m ; i ++){
scanf("%d%d" , &a , &b);
addedge(a , b);
in[b] ++;
}
topsort();
printf("\n");
}
return 0;
}