给出一个图的结构,输出其拓扑排序序列,要求在同等条件下,编号小的顶点在前
输入若干行整数,第一行有2个数,分别为顶点数v和弧数a,接下来有a行,每一行有2个数,分别是该条弧所关联的两个顶点编号输出若干个空格隔开的顶点构成的序列(用小写字母)样例输入
6 8
1 2
1 3
1 4
3 2
3 5
4 5
6 4
6 5
样例输出
输入若干行整数,第一行有2个数,分别为顶点数v和弧数a,接下来有a行,每一行有2个数,分别是该条弧所关联的两个顶点编号输出若干个空格隔开的顶点构成的序列(用小写字母)样例输入
6 8
1 2
1 3
1 4
3 2
3 5
4 5
6 4
6 5
样例输出
v1 v3 v2 v6 v4 v5
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
#define MAXN 28
int map[MAXN][MAXN];
int in_du[MAXN];
int adj[MAXN];
int n,m;
void toposort()
{
int i,j,k;
memset(in_du,0,sizeof(in_du));
memset(adj,0,sizeof(adj));
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
if(map[i][j]==1)
in_du[j]++; //入度加一
}
for(i=1; i<=n; i++) //每次产生一个字符
{
k=0;
for(j=1; j<=n; j++)
{
if(in_du[j]==0)
{
if(k==0)
k=j;
}
}
in_du[k]=-1;
adj[i-1]=k;
for(j=1; j<=n; j++) //k指向的节点入度都减一,即去掉A及它相关的边
{
if(map[k][j]==1)
in_du[j]--;
}
}
}
int main()
{
while(cin>>n>>m)
{
memset(map,0,sizeof(map));
for(int i=1;i<=m;i++)
{
int a,b;
cin>>a>>b;
map[a][b]=1;
}
toposort();
for(int i=0;i<n-1;i++)
{
cout<<"v"<<adj[i]<<" ";
}
cout<<"v"<<adj[n-1]<<endl;
}
return 0;
}