输入
的第一行包含一个正整数n,表示图中共有n个顶点。其中n不超过50。
以后的n行中每行有n个用空格隔开的整数0或1,对于第i行的第j个整数,如果为1,则表示第i个顶点有指向第j个顶点的有向边,0表示没有i指向j的有向边。当i和j相等的时候,保证对应的整数为0。
输出
如果读入的有向图含有回路,请输出“ERROR”,不包括引号。
如果读入的有向图不含有回路,请按照题目描述中的算法依次输出图的拓扑有序序列,每个整数后输出一个空格。
请注意行尾输出换行。
样例输入
4
0 1 0 0
0 0 1 0
0 0 0 0
0 0 1 0
样例输出
3 0 1 2
#include<iostream>
#include<stack>
#include <queue>
using namespace std;
#define ERROR -1
#define OK 1
#define MAX 51
int n;
queue<int> q;//用来存储拓扑序列
bool TopoloicalSort(int a[MAX][MAX]){
stack<int>s;
int* indegree=new int[n];
for(int i=0;i<n;i++)
indegree[i]=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(a[i][j]!=0){
indegree[j]++;//求各顶点的入度情况
}
}
}
for(int i=0;i<n;i++){
if(!indegree[i]){
s.push(i);
}
}
int count=0;//对输出进行计数
while(!s.empty()){
int v=s.top();
s.pop();
q.push(v);
++count;
for(int i=0;i<n;i++){
if(a[v][i]!=0){
indegree[i]--;
if(!indegree[i]){
s.push(i);
}
}
}
}
if(count==n)
return true;
else
return false;
}
int main() {
int a[MAX][MAX];
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>a[i][j];
}
}
bool b=TopoloicalSort(a);
if(b){
while(!q.empty()){
cout<<q.front()<<" ";
q.pop();
}
}else
cout<<"ERROR"<<endl;
return 0;
}