用队列和栈都可以实现,拓扑排序并没有用到visit数组
int graph[500][500]={0};
int degree[500]={0};
int main(){
int n;
int i,j;
cin>>n;
int x,y;
for(i=0;i<n;i++){
cin>>x>>y;
graph[x][y]=1;
}
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if(graph[i][j]==1){
degree[j]++;
}
}
}
queue<int> s;
int count=0;
for( i=1;i<=n;i++){
if(degree[i]==0){
s.push(i);
}
}
while(!s.empty()){
cout<<s.front();
int temp=s.front();
count++;
s.pop();
for( i=1;i<=n;i++){
if(graph[temp][i]){//不会找到自己因为自己和自己没有边
degree[i]--;
if(degree[i]==0)
s.push(i);//这三行代码一定要写在同一个大括号里面,不然已经访问过的结点会重新入队造成循环无限
}
}
}
if(count==n) cout<<"存在拓扑排序";
}