• Leetcode1489-找到最小生成树里的关键边和伪关键边


    kruskal+并查集

    题目数据量不大,因此考虑暴力枚举最小生成树的做法。

    用到的数据结构:

    数组vis:标记该边是否为关键边

    数组real,fake:分别记录关键边和伪关键边

    并查集p

    ①为所有边添加上一个编号,然后按边权升序排列。

    ②先对整个图跑kruskal求一遍最小生成树的权值w。

    ③枚举所有边,除去该边求整个图的最小生成树的权值nw,若和w不同,则说明该边为关键边,加入到real数组中,并在vis数组中标记它。

    ④枚举所有非关键边,先把该边的两端结点加入到并查集中,即把该边强行加入到最小生成树中,再求整颗最小生成树的权值nw,如果和w相同,则表示即使整个图没有这条非关键边,最小生成树的权值仍为w,也即该边为伪关键边,加入到fake数组中。

    ⑤把real和fake作为答案返回。

    1. class Solution {
    2. public:
    3. vector<int> p=vector<int>(110);
    4. int findd(int x){
    5. return p[x]==x?x:p[x]=findd(p[x]);
    6. }
    7. void unionn(int x,int y){
    8. x=findd(x),y=findd(y);
    9. p[x]=y;
    10. }
    11. vectorint>> findCriticalAndPseudoCriticalEdges(int n, vectorint>>& edges){
    12. int m=edges.size();
    13. vector<int> vis(m,0);
    14. vector<int> real,fake;
    15. vectorint>> ans;
    16. for(int i=0;ipush_back(i);
    17. sort(edges.begin(),edges.end(),[](const auto &a,const auto &b){
    18. return a[2]2];
    19. });
    20. int w=0;
    21. iota(p.begin(),p.end(),0);
    22. for(int i=0;i
    23. int x=findd(edges[i][0]);
    24. int y=findd(edges[i][1]);
    25. if(x!=y){
    26. unionn(x,y);
    27. w+=edges[i][2];
    28. }
    29. }
    30. for(int i=0;i
    31. int nw=0;
    32. iota(p.begin(),p.end(),0);
    33. for(int j=0;j
    34. if(i==j) continue;
    35. int x=findd(edges[j][0]);
    36. int y=findd(edges[j][1]);
    37. if(x!=y){
    38. unionn(x,y);
    39. nw+=edges[j][2];
    40. }
    41. }
    42. if(nw!=w){
    43. real.push_back(edges[i][3]);
    44. vis[edges[i][3]]=1;
    45. }
    46. }
    47. for(int i=0;i
    48. if(vis[edges[i][3]]) continue;
    49. iota(p.begin(),p.end(),0);
    50. int nw=edges[i][2];
    51. unionn(edges[i][0],edges[i][1]);
    52. for(int j=0;j
    53. if(i==j) continue;
    54. int x=findd(edges[j][0]);
    55. int y=findd(edges[j][1]);
    56. if(x!=y){
    57. unionn(x,y);
    58. nw+=edges[j][2];
    59. }
    60. }
    61. if(nw==w) fake.push_back(edges[i][3]);
    62. }
    63. ans.push_back(real),ans.push_back(fake);
    64. return ans;
    65. }
    66. };

    时间复杂度:O(m^2·α(n)),α(n)为并查集的复杂度。

    空间复杂度:O(m+n)

  • 相关阅读:
    前端开发者工具
    pandas分组与聚合groupby()函数详解
    Java多线程之 理解重排序
    QT使用前的知识
    javascript算法排序之选择排序
    C. Beautiful Sets of Points(找规律&杂题)
    封装全局异常处理
    Web3时代到来:非洲兄弟已经在用它“养家糊口”
    旧版elasticsearch 2.3.4 集群部署过程
    ETCD详解
  • 原文地址:https://blog.csdn.net/aaa7888210/article/details/128194350