#include <iostream>
using namespace std;
#define N 13
int main()
{
int map[N][N]; //邻接矩阵
// 初始化矩阵的值全部为0表示各个顶点间没有边连接
for(int i = 0; i <= N-1; i++){
for(int j = 0; j <= N-1; j++){
map[i][j] = 0;
}
}
int a,b; //定义两个变量,用来输入
int v,l; //顶点数和边数
cout << "请输入顶点数:";
cin >> v;
cout << "请输入边数:";
cin >> l;
cout << "请输入边:" << endl;
for(int i = 1; i <= l; i++){
cin >> a >> b;
map[a][b] = 1; // 表示顶点a指向顶点b的边
}
cout << "邻接矩阵如下所示\n" << endl;
for(int i = 1; i <= N-1; i++){
for(int j = 1; j <= N-1; j++){
cout << map[i][j];
}
cout << endl;
}
int k; //用于计算度数
int ID[N]; //用于存放入度
for(int i = 1; i <= v; i++){ // 计算入度
k = 0;
for(int j = 1; j <= v; j++){
if(map[j][i] == 1) //如果顶点j到顶点i有边,则顶点i的入度+1
k++;
}
ID[i] = k;
}
//1、在有向图中选一个没有前驱的顶点并且输出
cout << "\n\n拓扑序列: ";
int count = 0; //最后用来判断是否所有的顶点输出
while(1){
for(int i = 1; i <= v; i++){
if(ID[i] == 0){
cout << i << " "; //输出顶点
count++;
//2、从图中删除该顶点和所有以它为尾的弧,即删除所有与它有关的边。
ID[i] = -1; //将此顶点入度设为-1,表示删除
for(int j = 1; j <= v; j++){
if(map[i][j] == 1){ //如果顶点j与顶点i有边,则删除这条边,并且顶点j的入度-1
ID[j]--;
}
}
}
}
//3、重复上述两步,直至全部顶点均已输出;或者当图中不存在无前驱的顶点为止。
if(count == v){
break; //若count == 顶点数,表示所有顶点的入度都为-1,即所有的边均已输出,停止操作。
}
}
return 0;
}