美团 小美的朋友关系 Java

import java.util.*;
import java.io.*;

public class Main {
    // 并查集:父节点映射 + 秩映射(按秩合并用)
    public static HashMap<Integer, Integer> parent = new HashMap<>();
  
    // 查找(路径压缩 + 自动初始化节点)
    public static int find(int x) {
        // 节点不存在则初始化:父节点是自己,秩为1
        parent.putIfAbsent(x, x);
        // 路径压缩(迭代版,避免递归栈溢出)
        while (!parent.get(x).equals(x)) {
            parent.put(x, parent.get(parent.get(x))); // 父节点指向祖父节点
            x = parent.get(x);
        }
        return x;
    }

    // 合并(按秩合并 + 路径压缩)
    public static void merge(int x, int y) {
        int rootX = find(x);
        int rootY = find(y);
        if (rootX == rootY) return;

        // 按秩合并:将秩小的树合并到秩大的树
        parent.put(rootY, rootX);
    }

    // 生成统一的边key(避免{a,b}和{b,a}重复)
    static String getRelationKey(int a, int b) {
        return a < b ? a + "," + b : b + "," + a;
    }

    public static void main(String[] args) throws IOException {
        // 替换Scanner为BufferedReader,提升输入效率
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] parts = br.readLine().split(" ");
        int n = Integer.parseInt(parts[0]);
        int m = Integer.parseInt(parts[1]);
        int q = Integer.parseInt(parts[2]);

        // 存储原始边
        Set<String> edges = new HashSet<>();
        for (int i = 0; i < m; ++i) {
            parts = br.readLine().split(" ");
            int a = Integer.parseInt(parts[0]);
            int b = Integer.parseInt(parts[1]);
            edges.add(getRelationKey(a, b));
        }

        // 存储有效操作(过滤无效删除)
        ArrayList<int[]> ops = new ArrayList<>();
        for (int i = 0; i < q; ++i) {
            parts = br.readLine().split(" ");
            int op = Integer.parseInt(parts[0]);
            int a = Integer.parseInt(parts[1]);
            int b = Integer.parseInt(parts[2]);

            if (op == 1) {
                String key = getRelationKey(a, b);
                if (edges.contains(key)) {
                    edges.remove(key);
                    ops.add(new int[]{op, a, b});
                }
            } else {
                ops.add(new int[]{op, a, b});
            }
        }

        // 初始化:合并所有未被删除的边(最终状态)
        for (String key : edges) {
            String[] nodes = key.split(",");
            int a = Integer.parseInt(nodes[0]);
            int b = Integer.parseInt(nodes[1]);
            merge(a, b);
        }

        // 倒序处理操作,记录答案
        List<Boolean> answers = new ArrayList<>();
        for (int i = ops.size() - 1; i >= 0; i--) {
            int[] op = ops.get(i);
            if (op[0] == 1) {
                // 原删除操作 → 逆操作:合并
                merge(op[1], op[2]);
            } else {
                // 原查询操作:判断是否连通
                boolean connected = find(op[1]) == find(op[2]);
                answers.add(connected);
            }
        }

        // 逆序输出答案
        for (int i = answers.size() - 1; i >= 0; --i) {
            System.out.println(answers.get(i) ? "Yes" : "No");
        }
    }
}
全部评论
同学,瞅瞅我司,医疗独角兽, 因为新业务扩展,11月校招HC暴增! 我的主页最新动态,绿灯直达,免笔试~
1 回复 分享
发布于 11-06 13:28 广东

相关推荐

转眼间实习就已经半个月了,如果是从第一次开始实习来算,其实已经差不多一个半月了😂为啥会有两种时间说法呢,是因为我第一段实习时间其实很短。当时刚投简历,投后三四天就拿到了三维家的&nbsp;offer,我身边很多朋友都说这也是一个很不错的中厂,加上是我第一次投实习,所以就接了这个&nbsp;offer。但是在这个准备的时间中,我字节的面试也依次通过了一二面。后来入职三维家,刚好国庆,假期前后字节的三面与&nbsp;hr&nbsp;面也顺利通过了最后三维家实习了一星期就说学校抓人了,偷偷润掉去字节了(说来还有点对不起三维家导师的,感觉他人也挺好刚熟悉起来我就跑了😂)从三维家离职的当天,也是我入职字节的当天。广州的&nbsp;mt&nbsp;行事风格很干练,进去的时候我是安排在一个临时位置上(因为刚好第二周要换座位+刚好有一个同事出差不在),和我&nbsp;mt&nbsp;刚好在过道两头,又加上他很忙,组里就我一个实习生,我几乎就没啥机会问问题,也有点不太敢问,甚至项目跑起来都不知道怎么打开,头几天纯适应环境去了原本的&nbsp;base&nbsp;是广州,离学校只有十几公里,走路+坐地铁&nbsp;40&nbsp;分钟也能到。结果刚进来几天,周中突然&nbsp;ld&nbsp;找到我,说组内业务调整,要被调去深圳,还要换&nbsp;mt🥲当时其实真有点懵,突然就要考虑一个人租房、不回学校等等事情,一点经验都没有,很迷茫。不过好在有对象的支持☺️,有师兄的指点,有一个同学刚好也要入职同部门后端+他提前查过攻略,没经验就到处问,最后还是顺利来到了深圳,租好了房子,处理好了很多事情当我把一切都准备好、真的来到深圳以后,我发现,其实来深圳也有来的好处:ld&nbsp;考虑到我换&nbsp;base&nbsp;地找租房,让我申请了两星期出差旅,因此来到这里头两周可以爽住大酒店&nbsp;+&nbsp;每日补贴&nbsp;150&nbsp;+&nbsp;市内打车全免;租房有&nbsp;1000&nbsp;房补可以租近一点,理论上通勤时间比广州要快不少,可以更晚点起床;景湖是字节自建楼,设施饮食之类的很多感觉比广州好,周围很多别家写字楼+商场也比广州琶洲那块热闹;感受不同的大城市的环境,多一种体验……可能因为我刚好卡到了换&nbsp;base&nbsp;的&nbsp;bug,可能因为这段时间走到我这个地方的需求少,来字节的两个星期工作不算很多,第一个星期没有需求,每天就坐在工位上熟悉项目结构学&nbsp;react&nbsp;和微前端;第二个星期来到了深圳,一边问&nbsp;mt&nbsp;一边问&nbsp;AI&nbsp;慢慢了解了项目的结构,目前也就做了两个小需求(感觉给到我的都不算很急,mt&nbsp;也说主要是通过需求熟悉项目)。工作时间也蛮弹性的,早上&nbsp;10&nbsp;点半多来到公司,晚上看心情走(只要工作做完了你几点走都没问题),来到深圳就一个人也不介意一整天都把自己投入到工作与学习上,幸福感还是挺高的。一整天醒了就去公司,下午下班去健身,晚上干完就回去休息如今,实习生活满打满算也有一个多月了,感觉一路上还是挺顺风顺水的,我也喜欢现在正在做的事😉也祝屏幕前的朋友能够顺风顺水,心想事成,我们一起加油
LZStarV:突然想起来一个有意思的小细节,我人生第一天实习刚好是我 20 岁生日
字节跳动公司福利 1328人发布
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务