图论第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);
    }
};

那明天开始做面试题。

相关推荐
数据分析螺丝钉20 分钟前
力扣第240题“搜索二维矩阵 II”
经验分享·python·算法·leetcode·面试
no_play_no_games20 分钟前
「3.3」虫洞 Wormholes
数据结构·c++·算法·图论
五味香21 分钟前
C++学习,信号处理
android·c语言·开发语言·c++·学习·算法·信号处理
毕小宝1 小时前
逻辑回归(下): Sigmoid 函数的发展历史
算法·机器学习·逻辑回归
小叮当爱咖啡1 小时前
DenseNet算法:口腔癌识别
算法
希望有朝一日能如愿以偿1 小时前
算法(食物链)
算法
鱼跃鹰飞1 小时前
Leecode热题100-295.数据流中的中位数
java·服务器·开发语言·前端·算法·leetcode·面试
summ1ts1 小时前
组合数求法汇总
c++·数学·算法·离散数学·组合数学
@qike2 小时前
【C++】—— 日期类的实现
c语言·c++·笔记·算法·学习方法
luthane2 小时前
python 实现djb2哈希算法
python·算法·哈希算法