leetcode684冗余连接(模板题,理解背过就行)

leetcode684冗余连接(模板题,理解背过就行)

考了图的连通,笔试碰见了还好老底没忘,不然就尬住了,总结一下。

一、题目

树可以看成是一个连通且 无环无向 图。

给定往一棵 n 个节点 (节点值 1~n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1n 中间,且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n 的二维数组 edgesedges[i] = [ai, bi] 表示图中在 aibi 之间存在一条边。

请找出一条可以删去的边,删除后可使得剩余部分是一个有着 n 个节点的树。如果有多个答案,则返回数组 edges 中最后出现的那个。

二、示例

image

输入: edges = [[1,2], [1,3], [2,3]]
输出: [2,3]

image

输入: edges = [[1,2], [2,3], [3,4], [1,4], [1,5]]
输出: [1,4]

三、提示

n == edges.length

3 <= n <= 1000

edges[i].length == 2

1 <= ai < bi <= edges.length

ai != bi

edges中无重复元素
给定的图是连通的

四、详解

package main;

/**
 * @author 芊嵛
 * @date 2024/3/22
 */
public class Test02 {
    public static void main(String[] args) {
        // 节点n
        int n = 5;
        // 边
        int[][] edges = {{1, 2}, {2, 3}, {3, 4}, {1, 4}, {1, 5}};
        // 调用函数求结果
        System.out.print("[" + res(edges)[0] + "," + res(edges)[1] + "]");
    }

    public static int[] res(int[][] edges) {
//        定义连通的图,为的是下标从1开始所以+1
        int[] map = new int[edges.length + 1];
//        初始化自己给自己连通,自己到自己肯定是通的
        for (int i = 0; i < map.length; i++) {
            map[i] = i;
        }

        // 全部遍历看是否连通
        for (int i = 0; i < edges.length; i++) {
            // 如果连通代表不需要这个点可以删,多了就成环了
            if (connected(edges[i][0], edges[i][1], map)) {
                return new int[]{edges[i][0], edges[i][1]};
            } else {
                // 如果不连通把他们加入图中
                union(edges[i][0], edges[i][1], map);
            }
        }
        // 返回值在此题中无用
        return new int[0];
    }

    //    找到根节点
    public static int find(int n, int[] map) {
        while (map[n] != n) {
            map[n] = map[map[n]];
            n = map[n];
        }
        return map[n];
    }

    //    根据根节点判断是否连通
    public static boolean connected(int n, int m, int[] map) {
        // 如果两个点连通代表他们的根节点都相同
        return find(n, map) == find(m, map);
    }


    // 如果不连通,让他们加入图中
    public static void union(int n, int m, int[] map) {
        int f1 = find(n, map);
        int f2 = find(m, map);
        if (f1 == f2) {
            return;
        }
        map[f1] = f2;
    }

}

五、拓展

可以在试着求一下连通分量

posted @   芊嵛  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
  1. 1 イエスタデイ(翻自 Official髭男dism) 茶泡饭,春茶,kobasolo
  2. 2 世间美好与你环环相扣 柏松
イエスタデイ(翻自 Official髭男dism) - 茶泡饭,春茶,kobasolo
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 藤原聡

作曲 : 藤原聡

何度失ったって

取り返して見せるよ

雨上がり 虹がかかった空みたいな

君の笑みを

例えばその代償に

誰かの表情を

曇らせてしまったっていい

悪者は僕だけでいい

本当はいつでも

誰もと思いやりあっていたい

でもそんな悠長な理想論は

ここで捨てなくちゃな

遥か先で 君へ 狙いを定めた恐怖を

遥か先で 君へ 狙いを定めた恐怖を

どれだけ僕は

はらい切れるんだろう?

半信半疑で 世間体

半信半疑で 世間体

気にしてばっかのイエスタデイ

ポケットの中で怯えたこの手は

まだ忘れられないまま

「何度傷ついたって

「何度傷ついたって

仕方ないよ」と言って

うつむいて君が溢した

儚くなまぬるい涙

ただの一粒だって

僕を不甲斐なさで 溺れさせて

理性を奪うには十分過ぎた

街のクラクションもサイレンも

街のクラクションもサイレンも

届きやしないほど

遥か先へ進め 身勝手すぎる恋だと

遥か先へ進め 身勝手すぎる恋だと

世界が後ろから指差しても

振り向かず進め必死で

振り向かず進め必死で

君の元へ急ぐよ

道の途中で聞こえたSOS さえ

気づかないふりで

バイバイイエスタデイ ごめんね

バイバイイエスタデイ ごめんね

名残惜しいけど行くよ

いつかの憧れと違う僕でも

ただ1人だけ 君だけ

守るための強さを

何よりも望んでいた この手に今

遥か先へ進め

遥か先へ進め

幼すぎる恋だと

世界が後ろから指差しても

迷わずに進め 進め

2人だけの宇宙へと

ポケットの中で震えたこの手で今

君を連れ出して

未来の僕は知らない

だから視線は止まらない

謎めいた表現技法

意味深な君の気性

アイラブユーさえ

アイラブユーさえ

風に 飛ばされそうな時でも

不器用ながら繋いだ この手はもう

決して離さずに

虹の先へ

点击右上角即可分享
微信分享提示