• 拓朴排序例题


    1.拓扑排序可以用来判断图中是否有环,

    2.还可以用来判断图是否是一条链。

     复制Markdown  展开

    题目描述

    一个不同的值的升序排序数列指的是一个从左到右元素依次增大的序列,例如,一个有序的数列 A,B,C,DA,B,C,D 表示A

    输入格式

    第一行有两个正整数 n,mn,m,nn 表示需要排序的元素数量,2\leq n\leq 262≤n≤26,第 11 到 nn 个元素将用大写的 A,B,C,D\dotsA,B,C,D… 表示。mm 表示将给出的形如 A

    接下来有 mm 行,每行有 33 个字符,分别为一个大写字母,一个 < 符号,一个大写字母,表示两个元素之间的关系。

    输出格式

    若根据前 xx 个关系即可确定这 nn 个元素的顺序 yyy..y(如 ABC),输出

    Sorted sequence determined after xxx relations: yyy...y.

    若根据前 xx 个关系即发现存在矛盾(如 A

    Inconsistency found after x relations.

    若根据这 mm 个关系无法确定这 nn 个元素的顺序,输出

    Sorted sequence cannot be determined.

    (提示:确定 nn 个元素的顺序后即可结束程序,可以不用考虑确定顺序之后出现矛盾的情况)

    输入输出样例

    输入 #1复制

    4 6
    A 
    

    输出 #1复制

    Sorted sequence determined after 4 relations: ABCD.

    输入 #2复制

    3 2
    A 
    

    输出 #2复制

    Inconsistency found after 2 relations.

    输入 #3复制

    26 1
    A 
    

    输出 #3复制

    Sorted sequence cannot be determined.

    说明/提示

    2 \leq n \leq 26,1 \leq m \leq 6002≤n≤26,1≤m≤600。

    这一道题一看就知道是拓扑排序。

    1.首先观察数据范围和输出,数据范围26,是真的小,就说明多搞一搞肯定也T不了。输出要求输出到第几次就行了,或者不行了,就说明我们每建一条边就需要一次拓扑排序。

    2.再看这道题的三种情况。第一个是有稳定顺序,第二个是有环,第三个是无环但是也没有稳定拓扑顺序。然后我们对这三个问题进行依次解决。

    第一个问题:有稳定拓扑排序说明拓扑排序的层数是n。也就是下面代码的val。一层一层下去如果是n层的话,那么这个图里面肯定包含一个n长度的链,我们只要看最大的层数是不是n就可以了,也就是代码的ans==n。

    第二个问题就是成环,拓扑排序判断有没有环其实很简单,如果拓扑排序没能遍历所有的点,就说明存在一个环。也就是下面的sum==s1.size()。s1是用来存储目前元素(点)个数的。

    最后一种情况最简单,如果前两种都不是,那肯定就是最后一种了!

    1. #include
    2. typedef long long ll;
    3. typedef double db;
    4. #define MAXN 50
    5. using namespace std;
    6. int n,m;
    7. struct Node{
    8. int u;
    9. int val;
    10. Node(int u=0,int val=0):u(u),val(val){}
    11. };
    12. vector<int> vec[MAXN];
    13. int ru[MAXN];
    14. int sum;
    15. int ans;
    16. int k;
    17. set<int> s1;
    18. void make(){
    19. queue<int> q;
    20. int ru1[MAXN];
    21. memset(ru1,0,sizeof(ru1));
    22. for(int i=0; i<26; i++){
    23. for(int j=0; jsize(); j++){
    24. ru1[vec[i][j]]++;
    25. }
    26. }
    27. for(int i=0; i<26; i++){
    28. if(ru1[i]==0&&s1.count(i)){
    29. q.push(i);
    30. cout<<char(i+'A');
    31. }
    32. }
    33. while(!q.empty()){
    34. int u=q.front();
    35. q.pop();
    36. for(int i=0; isize(); i++){
    37. int v=vec[u][i];
    38. ru1[v]--;
    39. if(ru1[v]==0){
    40. q.push(v);
    41. cout<<char(v+'A');
    42. }
    43. }
    44. }
    45. }
    46. int have;
    47. void topo(){
    48. queue q;
    49. for(int i=0; i<26; i++){
    50. if(ru[i]==0&&s1.count(i)){
    51. q.push(Node(i,1));
    52. sum++;
    53. }
    54. }
    55. while(!q.empty()){
    56. int u=q.front().u;
    57. int val=q.front().val;
    58. q.pop();
    59. for(int i=0; isize(); i++){
    60. int v=vec[u][i];
    61. ru[v]--;
    62. if(ru[v]==0){
    63. sum++;
    64. q.push(Node(v,val+1));
    65. ans=max(ans,val+1);
    66. }
    67. }
    68. }
    69. if(ans==n){
    70. printf("Sorted sequence determined after %d relations: ",k);
    71. make();
    72. cout<<".";
    73. exit(0);
    74. }
    75. if(sum!=have){
    76. printf("Inconsistency found after %d relations.",k);
    77. exit(0);
    78. }
    79. }
    80. int ru2[MAXN];
    81. int main(){
    82. cin>>n>>m;
    83. for(int i=1; i<=m; i++){
    84. string s;
    85. cin>>s;
    86. k=i;
    87. vec[s[0]-'A'].push_back(s[2]-'A');
    88. s1.insert(s[0]-'A');
    89. s1.insert(s[2]-'A');
    90. have=s1.size();
    91. ru2[s[2]-'A']++;
    92. sum=0;
    93. ans=0;
    94. memcpy(ru,ru2,sizeof(ru2));
    95. topo();
    96. }
    97. printf("Sorted sequence cannot be determined.");
    98. return 0;
    99. }

     

  • 相关阅读:
    Camunda 7.x 系列【38】表单服务 FormService
    MySQL - 深入理解锁机制和实战场景
    智慧门牌管理系统:省市区县区划数据与国家级开发区共融
    vscode OpenCV环境搭建
    面试题-React(九):React的Context:实现非父子组件通信
    linux操作系统期末考试题库
    乳糖不耐者的福音:这些常见乳制品的替代品快来了解一下吧!
    Springboot----实现邮箱验证码登录(代码部分)
    Day02 Spring和SpringBoot
    软件测试整理
  • 原文地址:https://blog.csdn.net/m0_61949623/article/details/126145537