Description
有向图的顶点数为n(0 < n<=20),图中的顶点信息为整数i(0 <=i<=n-1),采用邻接矩阵存储,编写程序输出该图的拓扑序列 。
要求:入度为零的顶点用栈存储。
Input
输入数据:
第1行:顶点数,弧数
第2行开始,每行输入一个顶点偶对,例如:vi,vj
Output
输出数据:
以空格分隔的拓扑序列,如果存在环,则输出空或者部分顶点。
Sample Input
6,8
0,1
0,2
0,3
2,1
2,4
3,4
5,3
5,4
Sample Output
5 0 3 2 4 1
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define MAX_VERTEX_NUM 20
using namespace std;
typedef struct
{
int arc[MAX_VERTEX_NUM+10][MAX_VERTEX_NUM+10];
int vexnum,arcnum;
} Mgraph;
int num[MAX_VERTEX_NUM+10];
void init(Mgraph *G)
{
memset(G->arc,0,sizeof(G->arc));
memset(num,0,sizeof(num));
char ch;
scanf("%d,%d",&G->vexnum,&G->arcnum);
for(int i=1; i<=G->arcnum; i++)
{
int a,b;
scanf("%d,%d",&a,&b);
if(!G->arc[a][b])
{
G->arc[a][b]=1;
num[b]++;
}
}
}
void topo(Mgraph &G)
{
int T=G.vexnum;
while(T--)
{
int sub=0,i,j;
for(i=G.vexnum-1; i>=0; i--)//题目要求栈存储入入度为0的点,这里要逆序遍历
{
if(!num[i])
{
sub=i;
break;
}
}
num[sub]--;
if(i==-1)
break;
else
cout<<sub<<" ";
for(j=0; j<G.vexnum; j++)
{
if(G.arc[sub][j]!=0) num[j]--;
}
}
}
int main()
{
Mgraph G;
init(&G);
topo(G);
}
数组实现
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
int N,M;
char ch;
while(cin>>N>>ch>>M)
{
int i,j,k,a,b;
int flag[501][501]= {0};
int num[501]= {0};
for(i=1; i<=M; i++)
{
cin>>a>>ch>>b;
if(flag[a][b]==0)
{
flag[a][b]=1;
num[b]++;
}
}
int t=0;
for(i=1; i<=N; i++)
{
for(j=N-1; j>=0; j--)
{
if(num[j]==0)
{
t=j;
break;
}
}
num[t]--;
if(j==-1)
break;
else
cout<<t<<" ";
for(k=0; k<N; k++)
{
if(flag[t][k]!=0)
num[k]--;
}
}
cout<<endl;
}
}