给定一个848. 有向图的拓扑序列 - 图1 个点 848. 有向图的拓扑序列 - 图2 条边的有向图,点的编号是848. 有向图的拓扑序列 - 图3848. 有向图的拓扑序列 - 图4,图中可能存在重边和自环。

请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出848. 有向图的拓扑序列 - 图5

若一个由图中所有点构成的序列848. 有向图的拓扑序列 - 图6满足:对于图中的每条边 848. 有向图的拓扑序列 - 图7#card=math&code=%28x%2Cy%29&id=WrDAD),848. 有向图的拓扑序列 - 图8848. 有向图的拓扑序列 - 图9 中都出现在 848. 有向图的拓扑序列 - 图10之前,则称848. 有向图的拓扑序列 - 图11是该图的一个拓扑序列。

输入格式

第一行包含两个整数848. 有向图的拓扑序列 - 图12848. 有向图的拓扑序列 - 图13

接下来848. 有向图的拓扑序列 - 图14行,每行包含两个整数848. 有向图的拓扑序列 - 图15848. 有向图的拓扑序列 - 图16,表示存在一条从点848. 有向图的拓扑序列 - 图17 到点848. 有向图的拓扑序列 - 图18 的有向边 848. 有向图的拓扑序列 - 图19#card=math&code=%28x%2Cy%29&id=pU6Ws)。

输出格式

共一行,如果存在拓扑序列,则输出任意一个合法的拓扑序列即可。

否则输出$ −1$。

数据范围

848. 有向图的拓扑序列 - 图20

输入样例:

  1. 3 3
  2. 1 2
  3. 2 3
  4. 1 3

输出样例:

  1. 1 2 3

初次尝试的cpp代码

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstring>
  4. using namespace std;
  5. const int N=100000+10;
  6. int n,m;
  7. int h[N],e[N],ne[N],idx;
  8. int q[N],d[N];
  9. void add(int a,int b)
  10. {
  11. e[idx]=b,ne[idx]=h[a],h[a]=idx++;
  12. }
  13. bool topsort()
  14. {
  15. int hh=0,tt=-1;
  16. for(int i=1;i<=n;i++)
  17. if(!d[i])
  18. q[++tt]=i;
  19. while(hh<=tt)
  20. {
  21. int t=q[hh++];
  22. for(int i=h[t];i!=-1;i=ne[i])
  23. {
  24. int j=e[i];
  25. d[j]--;
  26. if(d[j]==0) q[++tt]=j;
  27. }
  28. }
  29. return tt==n-1;
  30. }
  31. int main()
  32. {
  33. ios::sync_with_stdio(false);
  34. cin.tie(0);
  35. cin>>n>>m;
  36. memset(h,-1,sizeof h);
  37. for(int i=0;i<m;i++)
  38. {
  39. int a,b;
  40. cin>>a>>b;
  41. add(a,b);
  42. d[b]++;
  43. }
  44. if(topsort()) {
  45. for(int i=0;i<n;i++) printf("%d ",q[i]);
  46. puts("");
  47. }
  48. else puts("-1");
  49. return 0;
  50. }