图论第8天

685.冗余连接II

这题需要考虑两种情况:

1.两个输入

2.没有两个输入就是有成环

cpp 复制代码
class Solution
{
public:
    static const int N = 1005;
    int father[N];
    int n;
    void init()
    {
        for (int i = 0; i <= n; i++)
        {
            father[i] = i;
        }
    }
    int find(int x)
    {
        return x == father[x] ? x : father[x] = find(father[x]);
    }
    int isSame(int a, int b)
    {
        a = find(a);
        b = find(b);
        return (a == b);
    }
    void join(int a, int b)
    {
        a = find(a);
        b = find(b);
        if (a == b)
            return;
        father[b] = a;
    }
    bool lianggeshuru(vector<vector<int>> &edges, int deleteNode)
    {
        init();
        for (int i = 0; i < edges.size(); i++)
        {
            if (i == deleteNode)
                continue;
            if (isSame(edges[i][0], edges[i][1]))
            {
                return false;
            }
            join(edges[i][0], edges[i][1]);
        }
        return true;
    }
    vector<int> huan(vector<vector<int>> &edges)
    {
        init();
        for (int i = 0; i < n; i++)
        {
            if (isSame(edges[i][0], edges[i][1]))
                return edges[i];
            join(edges[i][0], edges[i][1]);
        }
        return {};
    }
    vector<int> findRedundantDirectedConnection(vector<vector<int>> &edges)
    {
        n = edges.size();
        int count[N] = {0};
        // 有两个输入
        for (int i = 0; i < n; i++)
        {
            count[edges[i][1]]++;
        }
        vector<int> vec;
        for (int i = n - 1; i >= 0; i--)
        {
            if (count[edges[i][1]] == 2)
            {
                vec.push_back(i);
                cout << i << endl;
            }
        }
        if (vec.size() > 0)
        {
            if (lianggeshuru(edges, vec[0]))
            {
                return edges[vec[0]];
            }
            else
            {
                return edges[vec[1]];
            }
        }
        // 有环
        return huan(edges);
    }
};

默写一遍再。其实突然就对这行代码不理解了,需要做个小实验。其实就是后面可以跟一个等式。

cpp 复制代码
    int find(int x)
    {
        return x == father[x] ? x : father[x] = find(father[x]);
    }

挺好挺好,默写出来啦!!!思路很重要!!!

cpp 复制代码
class Solution {
public:
    static const int N = 1005;
    int father[N] = {0};
    void init(int num){
        for(int i = 0;i < num;i++){
            father[i] = i;
        }
    }
    int find(int x){
        return x == father[x] ? x : father[x] = find(father[x]);
    }
    bool isSame(int a,int b){
        a = find(a);
        b = find(b);
        return (a == b);
    }
    void join(int a ,int b){
        a = find(a);
        b = find(b);
        if(a == b)return;
        father[b] = a;
    }
    bool liashuru(vector<vector<int>>& edges,int deleteNode){
        init(edges.size());// because 1 <= ui, vi <= n
        for(int i = 0;i< edges.size();i++){
            if(i == deleteNode)continue;
            if(isSame(edges[i][0],edges[i][1])){
                return false;
            }
            join(edges[i][0],edges[i][1]);
        }
        return true;
    }
    vector<int> huan(vector<vector<int>>& edges){
        init(edges.size());// because 1 <= ui, vi <= n
        for(int i = 0;i < edges.size();i++){
            if(isSame(edges[i][0],edges[i][1])){
                return edges[i];
            }
            join(edges[i][0],edges[i][1]);
        }
        return {};
    }
    vector<int> findRedundantDirectedConnection(vector<vector<int>>& edges) {
        int n = edges.size();
        int count[N] = {0};
        for(int i = 0;i < n;i++){
            count[edges[i][1]]++;
        }
        vector<int>vec;
        for(int i = n-1;i>=0;i--){
            if(count[edges[i][1]] == 2){
                vec.push_back(i);
            }
        }
        //俩输入
        if(vec.size() > 0){
            if(liashuru(edges,vec[0])){
                return edges[vec[0]];
            }else{
                return edges[vec[1]];
            }
        }
        //有环
        return huan(edges);
    }
};

那明天开始做面试题。

相关推荐
tankeven2 分钟前
HJ180 游游的最长稳定子数组
c++·算法
良木生香12 分钟前
【C++初阶】:泛型编程的代表作---C++初阶模板
c语言·开发语言·数据结构·c++·算法
过河卒_zh156676613 分钟前
技术狂奔之后:数字虚拟人走向规则时代
人工智能·算法·aigc·生成式人工智能·算法备案
boss-dog23 分钟前
3D视觉机器人中手眼标定的精度提升方法记录——ICP算法
算法·3d·机器人·手眼标定·icp
郝学胜-神的一滴37 分钟前
Softmax 从入门到精通:多分类激活函数的优雅解法
人工智能·python·算法·机器学习·分类·数据挖掘
xianyinsuifeng38 分钟前
C语言性能优化实战:从 printf 到 write,再到批量输出(性能提升30%+)
算法
Halo_tjn39 分钟前
Java 内部类
java·开发语言·算法
开心码农1号42 分钟前
Go关于切边变量本身地址和内部指向地址
前端·算法
旖-旎42 分钟前
栈(验证栈序列)(5)
c++·算法·leetcode·力扣·
三毛的二哥43 分钟前
障碍物遮挡判断算法
人工智能·算法·计算机视觉·3d