Sorce::Click here
Sample Input
5
0
4 5 1 0
1 0
5 3 0
3 0
Sample Output
2 4 5 3 1
题意
一个拓扑排序的模板题,注意下题目的输入即可。
题解
今天刚刚学了拓扑排序,多敲下模板熟悉一下。
AC code
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <string>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <functional>
#include <algorithm>
#define _USE_MATH_DEFINES
using namespace std;
typedef long long ll;
const int MAXN = 1e3+5;
int n, m;
int p[MAXN][MAXN];
int vis[MAXN];
int b[MAXN];
void topsort()
{
for(int i=1; i<=n; i++)//有n个点要输出,即循环n次。
{
for(int j=1; j<=n; j++)//题目要求小的编号在前,所以从1->n遍历
{
if(!vis[j])//当该点入度为0时,将该点输出。并将该点vis--(即将该点进行已经访问过的标记),同时删除与该点相连的边
{
vis[j]--;
if(i==1) printf("%d",j);
else printf(" %d",j);
for(int k=1; k<=n; k++)
{
if(p[j][k]) vis[k]--;
}
break;//(找到一个点后,即可break,进行下一次)
}
}
}
printf("\n");
}
int main()
{
int x;
cin>>n;
memset(p,0,sizeof(p));
memset(vis,0,sizeof(vis));
for(int i=1; i<=n; i++)
{
while(scanf("%d",&x))
{
if(x==0) break;
if(!p[i][x])
{
p[i][x] = 1;
vis[x]++;
}
}
}
topsort();
return 0;
}