• 力扣周赛 -- 370周赛


    先更新前两道题目,下午更新后两道

    两道模板题(拓扑排序)

    拓扑排序

    拓扑排序(Topological Sorting):一种对有向无环图(DAG)的所有顶点进行线性排序的方法,使得图中任意一点 $u$ 和 $v$,如果存在有向边 $$,则 $u$ 必须在 $v$ 之前出现。对有向图进行拓扑排序产生的线性序列称为满足拓扑次序的序列,简称拓扑排序。

    拓扑排序解决的主要问题?

    拓扑排序可以用来解决一些依赖关系的问题,比如项目的执行顺序,课程的选修顺序等。

     

     刚开始我的思路是,先想的是并查集,但是看了第二题(提示有向无环图)就先想拓扑排序了,第一道题的代码复制一下到第二题基本就可以解决第二道题(其实只要建出来拓扑序列,判断入度为0的有几个就行,超过2个就没有,不需要排序,我排序是因为自己默写一下拓扑排序)

     差分约束应该也是可以实现的

     但是我这里采用更为简单的做法,拓扑排序

     拓扑排序可以解决一系列具有依赖关系的问题,例如家谱树,课程表等等问题

     前三题为板子题

    1. class Solution {
    2. public:
    3. int din[310];
    4. int dou[310];
    5. int h[11010],ne[11010],e[11010],idx;
    6. queue<int> q;
    7. int sort_d[110];
    8. int sid = 0;
    9. void top_sort(int n)
    10. {
    11. for(int i = 0;i < n;i++)
    12. {
    13. if(!din[i]) q.push(i);
    14. }
    15. while(!q.empty())
    16. {
    17. auto t = q.front();
    18. q.pop();
    19. sort_d[sid++] = t;
    20. for(int i = h[t];i != -1;i = ne[i])
    21. {
    22. int b = e[i];//i是对应点的虚拟编号(相当于索引),正式编号是e[i]
    23. din[b]--;
    24. if(!din[b])
    25. {
    26. q.push(b);
    27. }
    28. }
    29. }
    30. }
    31. void add(int a,int b)
    32. {
    33. e[idx] = b,ne[idx] = h[a],h[a] = idx++;
    34. }
    35. int findChampion(vectorint>>& grid)
    36. {
    37. int n = grid.size();
    38. memset(h,-1,sizeof(h));
    39. memset(sort_d,-1,sizeof(sort_d));
    40. for(int i = 0;i < n;i++)
    41. {
    42. for(int j = 0;j < n;j++)
    43. {
    44. if(i != j)
    45. {
    46. int a_team = i;
    47. int b_team = j;
    48. if(grid[i][j])
    49. {
    50. //a队强
    51. din[b_team]++;
    52. dou[a_team]++;
    53. add(a_team,b_team);
    54. }
    55. else
    56. {
    57. //b队强
    58. din[a_team]++;
    59. dou[b_team]++;
    60. add(b_team,a_team);
    61. }
    62. }
    63. }
    64. }
    65. top_sort(n);
    66. if(sort_d[0] == -1) return -1;
    67. return sort_d[0];
    68. }
    69. };

     第二题也是板子题,跟第一题没什么区别,复制第一题的代码改一下就行了

    1. class Solution {
    2. public:
    3. int din[310];
    4. int dou[310];
    5. int h[111010],ne[111010],e[111010],idx;
    6. queue<int> q;
    7. int sort_d[110];
    8. int sid = 0;
    9. bool flag = false;
    10. void top_sort(int n)
    11. {
    12. for(int i = 0;i < n;i++)
    13. {
    14. if(!din[i]) q.push(i);
    15. }
    16. if(q.size() > 1)
    17. {
    18. flag = true;
    19. return ;
    20. }
    21. while(!q.empty())
    22. {
    23. auto t = q.front();
    24. q.pop();
    25. sort_d[sid++] = t;
    26. for(int i = h[t];i != -1;i = ne[i])
    27. {
    28. int b = e[i];//i是对应点的虚拟编号(相当于索引),正式编号是e[i]
    29. din[b]--;
    30. if(!din[b])
    31. {
    32. q.push(b);
    33. }
    34. }
    35. }
    36. }
    37. void add(int a,int b)
    38. {
    39. e[idx] = b,ne[idx] = h[a],h[a] = idx++;
    40. }
    41. int findChampion(int n,vectorint>>& edge)
    42. {
    43. memset(h,-1,sizeof(h));
    44. memset(sort_d,-1,sizeof(sort_d));
    45. int size_edge = edge.size();
    46. for(int i = 0;i < edge.size();i++)
    47. {
    48. int a = edge[i][0];
    49. int b = edge[i][1];
    50. //a队强
    51. add(a,b);
    52. din[b]++;
    53. dou[a]++;
    54. }
    55. top_sort(n);
    56. if(flag) return -1;
    57. return sort_d[0];
    58. }
    59. };

  • 相关阅读:
    Vue3.3 新特性 - 初体验
    Kmssink插件添加缩放显示功能的分析思路与具体实现
    51单片机STC89C52RC——5.1 LCD1602液晶显示屏
    Jetson nano 安装Ubuntu20.04系统
    《公路测设技术》课程网课最新作业测验考试
    Python基础语法(一)——变量定义和运算符的使用
    k8s-集群里的三种IP(NodeIP、PodIP、ClusterIP)
    Linux系统:进程控制
    第4周学习:MobileNetV1, V2, V3
    结构体指针的引入
  • 原文地址:https://blog.csdn.net/txh1873749380/article/details/134228521