1、问题描述
给定一个有向图,求出其拓扑排序序列。
2、算法
⑴、在有向图中选一个没有前驱的顶点且输出之(如果有多个顶点皆没有前驱,序号小的顶点先输出,如果b,d皆无前驱时,先输出b)
⑵、从图中删除该顶点和所有以它为尾的弧
重复⑴⑵两步,直到所有顶点输出为止
Input
第一行:样本顶点个数,假设为n。
第二行,n个顶点(用空格隔开)
第三行开始到n+2行:每一行是某顶点(按第二行的输入为序)与其它顶点之间是否有边,1表示有边,0表示没有边
Output
有向图拓扑排序序列(顶点之间用空格隔开)(最后一个顶点之后也留有空格)
Sample Input
5
a b c d e
0 1 0 1 1
0 0 1 0 0
0 0 0 0 1
0 0 1 0 0
0 0 0 0 0
Sample Output
a b d c e
#include <iostream>
using namespace std;
const int Max = 10;
struct Graph{
int MaxNum;
int MaxValue[Max];
int Adj[Max][Max];
bool visited[Max];
};
void initGr(Graph &G, int n){
G.MaxNum = n;
int i, j;
for(i = 0; i < G.MaxNum; i++){
for(j = 0; j < G.MaxNum; j++)
cin>>G.Adj[i][j];
}
for(i = 0; i< G.MaxNum; i++){
G.MaxValue[i] = i;
G.visited[i] = false;
}
}
void Change(Graph G,char b[]){
int i, j, k, m;
for(m = 0; m <G.MaxNum; m++){
for(i = 0; i < G.MaxNum; i++){
for(j = 0; j < G.MaxNum; j++){
if(G.Adj[j][i])
break;
}
if(j == G.MaxNum && !G.visited[i])
break;
}
cout<<b[i]<<" ";
for(k = 0; k <G.MaxNum; k++)
G.Adj[i][k] = 0;
G.visited[i] = true;
}
cout<<endl;
}
int main()
{
int t, n, i;
char *a;
Graph G[1];
//freopen("123.txt", "r", stdin);
cin>>n;
a = new char[n+1];
for(i = 0;i < n;i++)
cin>>a[i];
initGr(G[0], n);
Change(G[0],a);
return 0;
}