LintCode 591. Connecting Graph III (并查集经典题!!!)

本文介绍了一种使用并查集数据结构解决图连接问题的方法。在一个初始无边的图中,通过connect操作连接节点,并用query操作返回当前图的连通组件数量。示例代码展示了如何实现并查集,包括路径压缩优化,以高效地处理节点连接和查询。
  1. Connecting Graph III
    Given n nodes in a graph labeled from 1 to n. There is no edges in the graph at beginning.

You need to support the following method:

connect(a, b), an edge to connect node a and node b
query(), Returns the number of connected component in the graph
Example
5 // n = 5
query() return 5
connect(1, 2)
query() return 4
connect(2, 4)
query() return 3
connect(1, 4)
query() return 3

思路:并查集经典题。
代码如下:

class ConnectingGraph3 {
public:
    /**
     * @param a: An integer
     * @param b: An integer
     * @return: nothing
     */
    ConnectingGraph3(int n) {
        father.resize(n + 1);
        for (int i = 1; i <= n; ++i) {
            father[i] = i;
        }
        count = n; //total # of connected components
    }
     
    void connect(int a, int b) {
        int fatherA = find(a);
        int fatherB = find(b);
        if (fatherA != fatherB) {
            father[fatherA] = fatherB;    //not father[a] = father[b], not father[a] = fatherB
            count--;
        }
    }

    /**
     * @return: An integer
     */
    int query() {
        return count;
    }

private:
    vector<int> father;
    int count;
    int find(int x) {
        if (father[x] == x) return x;
        int x2 = x;
                
        while(x != father[x]) {
            x = father[x];
        }
        
        //path compression!!!
        while(x2 != x) {    
            int temp = father[x2];
            father[x2] = x;
            x2 = temp;
        }
        
        return x;
    }
    
};
<think>好的,用户现在提供的串口日志是“{该位置输出乱码}ConnectingtoWiFi...........WiFiConnected!IP:192.168.119.36”,需要解释这些输出的含义和可能的原因。首先,我需要分析每个部分的内容。首先,“{该位置输出乱码}”可能是串口打印时的乱码,可能的原因包括波特率不匹配、数据传输错误或代码中的错误打印。然后是“ConnectingtoWiFi...........”,这是连接WiFi时的等待过程,代码中通过循环打印点号。最后是成功连接的日志。接下来,我需要考虑用户可能的背景。用户可能在使用ESP8266开发板,遇到了串口输出乱码的问,需要排查原因。需要解释乱码的可能原因,比如波特率设置错误、硬件连接问、代码中的错误字符串等。然后,需要结合之前的代码分析。之前的代码中,setup函数初始化串口为115200波特率,如果用户的串口监视器设置的波特率不同,就会导致乱码。另外,乱码部分可能是未初始化的变量或错误的字符串拼接导致的。还要考虑其他可能的问,比如硬件问(如串口引脚接触不良)、数据传输中的干扰,或者代码中在连接WiFi前错误地打印了未初始化的变量。最后,需要总结可能的原因,并给出排查步骤,比如检查波特率、确认代码中的打印语句、检查硬件连接等。同时,根据用户的问,生成相关的问,帮助用户进一步思考和排查。</think> 你提供的串口日志包含两部分关键信息,其中第一部分出现乱码,第二部分为WiFi连接过程及结果。以下是具体分析: --- ### **1. 乱码部分:`{该位置输出乱码}`** #### 可能原因: - **串口波特率不匹配**:ESP8266代码中通过`Serial.begin(115200)`初始化了串口波特率(如代码所示),但用户使用的串口监视器(如Arduino IDE的串口工具)若未设置相同的波特率(如误设为9600),会导致数据解码错误,出现乱码。 - **未初始化的变量或错误字符串**:若代码中存在未初始化的`String`变量或错误的字符串拼接(如打印未赋值的变量),可能导致串口输出无意义的乱码。例如: ```cpp String errorStr; // 未初始化 Serial.print(errorStr); // 可能输出乱码 ``` - **硬件或通信干扰**:ESP8266的串口引脚(GPIO1/TX、GPIO3/RX)若接触不良,或附近有强电磁干扰,可能导致数据传输错误,表现为乱码。 - **多线程打印冲突**:若代码中存在多个地方同时调用`Serial.print()`(如中断函数和主循环同时打印),可能导致数据交错,出现乱码(但ESP8266的Arduino核心通常为单线程,此情况较少)。 --- ### **2. WiFi连接过程:`Connecting to WiFi...........`** 这是代码中`connectToWiFi()`函数的输出逻辑: - 代码通过`WiFi.begin(ssid, password)`启动WiFi连接。 - 在`while (WiFi.status() != WL_CONNECTED)`循环中,每500ms通过`Serial.print(".")`打印一个点,表示正在等待连接。 - 日志中的`...........`(多个点)表示设备尝试连接WiFi的时间(每个点间隔0.5秒,11个点约5.5秒)。 --- ### **3. 连接成功:`WiFi Connected! IP: 192.168.119.36`** 当`WiFi.status()`返回`WL_CONNECTED`(连接成功)时,代码打印此日志,说明: - WiFi连接成功,设备已获取到本地IP地址(`192.168.119.36`,属于私有网络地址)。 - 后续可通过该IP与其他设备通信(如通过HTTP请求访问公网API)。 --- ### **排查乱码的建议步骤** 1. **检查波特率**:确认串口监视器的波特率与代码中`Serial.begin(115200)`一致(必须设置为115200)。 2. **验证打印内容**:注释掉代码中可能产生乱码的打印语句(如`Serial.print("{该位置输出乱码}")`),确认是否由代码错误导致。 3. **检查硬件连接**:确保ESP8266的TX/RX引脚与串口转USB模块(如CH340)连接正常,无松动或短路。 4. **测试最小系统**:上传一个仅包含`Serial.println("Test")`的最简程序,验证串口是否正常工作(无乱码则排除硬件问)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值