美文网首页
1489. 找到最小生成树里的关键边和伪关键边

1489. 找到最小生成树里的关键边和伪关键边

作者: 来到了没有知识的荒原 | 来源:发表于2021-01-23 22:24 被阅读0次

1489. 找到最小生成树里的关键边和伪关键边

应该是某个周赛最后一题

kruskal的并查集

也可以用tarjan,但是暂时不会QAQ

class UnionFind{
    public:
    vector<int>p;
    vector<int>size;
    int n;
    int setcnt;

    UnionFind(int _n):n(_n),setcnt(_n){
        p.resize(n);
        for(int i=0;i<n;i++)p[i]=i;
    }

    int find(int x){
        if(p[x]!=x)p[x]=find(p[x]);
        return p[x];
    }
    bool merge(int a,int b){
        a=find(a);
        b=find(b);
        if(a==b)return false;
        if(a>b)swap(a,b);
        p[b]=a;
        setcnt--;
        return true;
    }
};

class Solution {
public:
    vector<vector<int>> findCriticalAndPseudoCriticalEdges(int n, vector<vector<int>>& edges) {
        int m=edges.size();
        for(int i=0;i<m;i++){
            edges[i].push_back(i);
        }
        sort(edges.begin(),edges.end(),[](const vector<int>&u,const vector<int>&v){
            return u[2]<v[2];
        });
        UnionFind uf(n);

        int v=0,setcnt=0;
        for(int i=0;i<m;i++){
            int a=edges[i][0],b=edges[i][1];

            if(uf.merge(a,b)){
                v+=edges[i][2];
            }
        }
        setcnt=uf.setcnt;

        vector<vector<int>>res(2);

        for(int i=0;i<m;i++){
            uf= UnionFind(n);
            int tmp=0;
            for(int j=0;j<m;j++){
                int a=edges[j][0],b=edges[j][1];
                if(i!=j && uf.merge(a,b)){
                    tmp+=edges[j][2];
                }
            }
            if(uf.setcnt>1 || uf.setcnt==1 && tmp>v){
                res[0].push_back(edges[i][3]);
                continue;  // 如果是关键边,就不是伪关键边,直接跳过
            }

            uf= UnionFind(n);
             tmp=edges[i][2];
            uf.merge(edges[i][0],edges[i][1]);

            for(int j=0;j<m;j++){
                int a=edges[j][0],b=edges[j][1];
                if(i!=j && uf.merge(a,b)){
                    tmp+=edges[j][2];
                }
            }
            if(tmp==v){
                res[1].push_back(edges[i][3]);
            }
        }
        return res;
    }
};

相关文章

  • 1489. 找到最小生成树里的关键边和伪关键边

    1489. 找到最小生成树里的关键边和伪关键边[https://leetcode-cn.com/problems/...

  • 通用的深度优先搜索+图的应用3:最小生成树

    问题描述: 选取具有最小权重的生成树,图G的最小生成树,包括所有顶点V及最少的边E,其中边权重最小。要求是:每个点...

  • 最小生成树、最大流、最小费用最大流问题精简

    最小生成树:  简单来说即图中一个使各点连通的N-1个边的子图,当边权和最小时为最小生成树。 经典Prim,Kru...

  • 面试题汇总

    算法 1、排序都有哪几种方法? 2、最小生成树 1.Kruskal算法 此算法可以称为“加边法”,初始最小生成树边...

  • 遗传算法实践(七) 最小生成树问题

    最小生成树问题描述 最小生成树问题时指在由个节点和条边组成的网络模型中寻找连接所有节点的生成树,使得其所有边的权值...

  • 7.9图的应用:最小生成树

    最小生成树:Prim算法 ❖解决最小生成树问题的Prim算法,属于“贪心算法”,即每步都沿着最小权重的边向前搜索。...

  • 数据结构-最小生成树

    生成树 生成树是连通图的最小连通子图。所谓最小是指:若在树中任意增加一条边,则将出现一个回路;若去掉一条边,将会使...

  • 生成树

    次小生成树: 可以用Prim算法先把i点到j点的最大边权值和最小生成树的权值求出来,再对最小生成树加边cost...

  • 数据结构(十):最小生成树

    最小生成树是带权无向连通图中权值最小的生成树,根据图中生成树定义可知, 个顶点的连通图中,生成树中边的个数为 ,向...

  • 【算法】最小生成树

    最小生成树是指,在边有权重的连通无向图上,图的总权重最小的连通子集(所有的结点都被连通,选取的边具有最小的权重和)...

网友评论

      本文标题:1489. 找到最小生成树里的关键边和伪关键边

      本文链接:https://www.haomeiwen.com/subject/hehpzktx.html