首页 > 其他分享 >2023-09-03:用go编写。给你一个 n 个节点的无向无根树,节点编号从 0 到 n - 1 给你整数 n 和一个长度为 n - 1 的二维整数数组 edges , 其中 edges[i] =

2023-09-03:用go编写。给你一个 n 个节点的无向无根树,节点编号从 0 到 n - 1 给你整数 n 和一个长度为 n - 1 的二维整数数组 edges , 其中 edges[i] =

时间:2023-09-03 16:32:01浏览次数:37  
标签:int coins 整数 next queue ++ edges 节点

2023-09-03:用go语言编写。给你一个 n 个节点的无向无根树,节点编号从 0 到 n - 1

给你整数 n 和一个长度为 n - 1 的二维整数数组 edges ,

其中 edges[i] = [ai, bi] 表示树中节点 ai 和 bi 之间有一条边。

再给你一个长度为 n 的数组 coins ,其中 coins[i] 可能为 0 也可能为 1 ,

1 表示节点 i 处有一个金币。

一开始,你需要选择树中任意一个节点出发。你可以执行下述操作任意次:

收集距离当前节点距离为 2 以内的所有金币,或者 移动到树中一个相邻节点。

你需要收集树中所有的金币,并且回到出发节点,请你返回最少经过的边数。

如果你多次经过一条边,每一次经过都会给答案加一。

输入:coins = [1,0,0,0,0,1], edges = [[0,1],[1,2],[2,3],[3,4],[4,5]]。

输出:2。

来自左程云

答案2023-09-03:

代码思路:

1.创建图结构和入度数组,并初始化空图和入度数组。

2.遍历边数组,将边的两个节点加入图中,同时更新入度数组。

3.创建队列,并将所有入度为1且节点上金币为0的节点加入队列。

4.使用BFS算法遍历队列,将入度-1并将入度为1且节点上金币为0的相邻节点加入队列。

5.继续遍历队列,将入度-1并记录节点的排名,并将入度为1的相邻节点加入队列。

6.计算满足条件的边数,即排名大于等于2的边。

7.返回计数值作为最少经过的边数。

总的时间复杂度:O(n),其中n为节点数量,需要遍历边数组和节点数组,同时进行BFS操作。

总的额外空间复杂度:O(n),需要创建图结构、入度数组和队列。

go完整代码如下:

package main

import "fmt"

func collectTheCoins(coins []int, edges [][]int) int {
	n := len(coins)
	graph := make([][]int, n)
	inDegree := make([]int, n)

	for i := 0; i < n; i++ {
		graph[i] = []int{}
	}

	for _, edge := range edges {
		graph[edge[0]] = append(graph[edge[0]], edge[1])
		graph[edge[1]] = append(graph[edge[1]], edge[0])
		inDegree[edge[0]]++
		inDegree[edge[1]]++
	}

	queue := make([]int, n)
	l, r := 0, 0

	for i := 0; i < n; i++ {
		if inDegree[i] == 1 && coins[i] == 0 {
			queue[r] = i
			r++
		}
	}

	for l < r {
		cur := queue[l]
		l++
		for _, next := range graph[cur] {
			if inDegree[next]--; inDegree[next] == 1 && coins[next] == 0 {
				queue[r] = next
				r++
			}
		}
	}

	for i := 0; i < n; i++ {
		if inDegree[i] == 1 && coins[i] == 1 {
			queue[r] = i
			r++
		}
	}

	rank := make([]int, n)

	for l < r {
		cur := queue[l]
		l++
		for _, next := range graph[cur] {
			if inDegree[next]--; inDegree[next] == 1 {
				rank[next] = rank[cur] + 1
				queue[r] = next
				r++
			}
		}
	}

	ans := 0

	for _, edge := range edges {
		if rank[edge[0]] >= 2 && rank[edge[1]] >= 2 {
			ans += 2
		}
	}

	return ans
}

func main() {
	coins := []int{1, 0, 0, 0, 0, 1}
	edges := [][]int{{0, 1}, {1, 2}, {2, 3}, {3, 4}, {4, 5}}

	result := collectTheCoins(coins, edges)
	fmt.Println(result)
}

2023-09-03:用go编写。给你一个 n 个节点的无向无根树,节点编号从 0 到 n - 1 给你整数 n 和一个长度为 n - 1 的二维整数数组 edges , 其中 edges[i] =_i++

rust完整代码如下:

fn collect_the_coins(coins: Vec<i32>, edges: Vec<Vec<i32>>) -> i32 {
    let n = coins.len();
    let mut graph: Vec<Vec<i32>> = vec![vec![]; n];
    let mut in_degree: Vec<i32> = vec![0; n];

    for edge in &edges {
        let u = edge[0];
        let v = edge[1];
        graph[u as usize].push(v);
        graph[v as usize].push(u);
        in_degree[u as usize] += 1;
        in_degree[v as usize] += 1;
    }

    let mut queue: Vec<i32> = vec![0; n];
    let mut l = 0;
    let mut r = 0;
    for i in 0..n {
        if in_degree[i] == 1 && coins[i] == 0 {
            queue[r as usize] = i as i32;
            r += 1;
        }
    }

    while l < r {
        let cur = queue[l as usize];
        l += 1;
        for &next in &graph[cur as usize] {
            in_degree[next as usize] -= 1;
            if in_degree[next as usize] == 1 && coins[next as usize] == 0 {
                queue[r as usize] = next;
                r += 1;
            }
        }
    }

    for i in 0..n {
        if in_degree[i] == 1 && coins[i] == 1 {
            queue[r as usize] = i as i32;
            r += 1;
        }
    }

    let mut rank: Vec<i32> = vec![0; n];
    while l < r {
        let cur = queue[l as usize] as usize;
        l += 1;
        for &next in &graph[cur] {
            in_degree[next as usize] -= 1;
            if in_degree[next as usize] == 1 {
                rank[next as usize] = rank[cur] + 1;
                queue[r as usize] = next;
                r += 1;
            }
        }
    }

    let mut ans = 0;
    for edge in &edges {
        let u = edge[0] as usize;
        let v = edge[1] as usize;
        if rank[u] >= 2 && rank[v] >= 2 {
            ans += 2;
        }
    }

    ans
}

fn main() {
    let coins = vec![0, 0, 0, 1, 1, 0, 0, 1];
    let edges = vec![
        vec![0, 1],
        vec![0, 2],
        vec![1, 3],
        vec![1, 4],
        vec![2, 5],
        vec![5, 6],
        vec![5, 7],
    ];

    let result = collect_the_coins(coins, edges);
    println!("Result: {}", result);
}

2023-09-03:用go编写。给你一个 n 个节点的无向无根树,节点编号从 0 到 n - 1 给你整数 n 和一个长度为 n - 1 的二维整数数组 edges , 其中 edges[i] =_i++_02

c++完整代码如下:

#include <iostream>
#include <vector>

using namespace std;

int collectTheCoins(vector<int>& coins, vector<vector<int>>& edges) {
    int n = coins.size();
    vector<vector<int>> graph(n);
    vector<int> inDegree(n, 0);
    for (auto& edge : edges) {
        graph[edge[0]].push_back(edge[1]);
        graph[edge[1]].push_back(edge[0]);
        inDegree[edge[0]]++;
        inDegree[edge[1]]++;
    }
    vector<int> queue;
    int l = 0, r = 0;
    for (int i = 0; i < n; ++i) {
        if (inDegree[i] == 1 && coins[i] == 0) {
            queue.push_back(i);
            r++;
        }
    }
    while (l < r) {
        int cur = queue[l++];
        for (int next : graph[cur]) {
            if (--inDegree[next] == 1 && coins[next] == 0) {
                queue.push_back(next);
                r++;
            }
        }
    }
    for (int i = 0; i < n; ++i) {
        if (inDegree[i] == 1 && coins[i] == 1) {
            queue.push_back(i);
            r++;
        }
    }
    vector<int> rank(n, 0);
    while (l < r) {
        int cur = queue[l++];
        for (int next : graph[cur]) {
            if (--inDegree[next] == 1) {
                rank[next] = rank[cur] + 1;
                queue.push_back(next);
                r++;
            }
        }
    }
    int ans = 0;
    for (auto& edge : edges) {
        if (rank[edge[0]] >= 2 && rank[edge[1]] >= 2) {
            ans += 2;
        }
    }
    return ans;
}

int main() {
    vector<int> coins = { 1, 0, 0, 0, 0, 1 };
    vector<vector<int>> edges = { {0, 1}, {1, 2}, {2, 3}, {3, 4}, {4, 5} };

    int result = collectTheCoins(coins, edges);
    cout << result << endl;

    return 0;
}

2023-09-03:用go编写。给你一个 n 个节点的无向无根树,节点编号从 0 到 n - 1 给你整数 n 和一个长度为 n - 1 的二维整数数组 edges , 其中 edges[i] =_i++_03

c完整代码如下:

#include <stdio.h>
#include <stdlib.h>

int collectTheCoins(int* coins, int coinsSize, int** edges, int edgesSize, int* edgesColSize) {
    int n = coinsSize;
    int** graph = (int**)malloc(n * sizeof(int*));
    int* inDegree = (int*)calloc(n, sizeof(int));

    for (int i = 0; i < n; i++) {
        graph[i] = (int*)malloc(n * sizeof(int));
    }

    for (int i = 0; i < edgesSize; i++) {
        int v = edges[i][0];
        int u = edges[i][1];
        graph[v][u] = 1;
        graph[u][v] = 1;
        inDegree[v]++;
        inDegree[u]++;
    }

    int* queue = (int*)malloc(n * sizeof(int));
    int l = 0, r = 0;
    for (int i = 0; i < n; ++i) {
        if (inDegree[i] == 1 && coins[i] == 0) {
            queue[r++] = i;
        }
    }

    while (l < r) {
        int cur = queue[l++];
        for (int next = 0; next < n; next++) {
            if (graph[cur][next] == 1) {
                if (--inDegree[next] == 1 && coins[next] == 0) {
                    queue[r++] = next;
                }
            }
        }
    }

    for (int i = 0; i < n; ++i) {
        if (inDegree[i] == 1 && coins[i] == 1) {
            queue[r++] = i;
        }
    }

    int* rank = (int*)calloc(n, sizeof(int));
    while (l < r) {
        int cur = queue[l++];
        for (int next = 0; next < n; next++) {
            if (graph[cur][next] == 1) {
                if (--inDegree[next] == 1) {
                    rank[next] = rank[cur] + 1;
                    queue[r++] = next;
                }
            }
        }
    }

    int ans = 0;
    for (int i = 0; i < edgesSize; i++) {
        if (rank[edges[i][0]] >= 2 && rank[edges[i][1]] >= 2) {
            ans += 2;
        }
    }

    // 释放动态分配的内存
    for (int i = 0; i < n; i++) {
        free(graph[i]);
    }
    free(graph);
    free(inDegree);
    free(queue);
    free(rank);

    return ans;
}

int main() {
    int coins[] = { 1, 0, 0, 0, 0, 1 };
    int* edges[] = {
        (int[]) {
0, 1
},
    (int[]) {
1, 2
},
    (int[]) {
2, 3
},
    (int[]) {
3, 4
},
    (int[]) {
4, 5
}
    };
    int coinsSize = sizeof(coins) / sizeof(coins[0]);
    int edgesSize = sizeof(edges) / sizeof(edges[0]);
    int edgesColSize[] = { 2, 2, 2, 2, 2 };

    int result = collectTheCoins(coins, coinsSize, edges, edgesSize, edgesColSize);
    printf("Result: %d\n", result);

    return 0;
}

2023-09-03:用go编写。给你一个 n 个节点的无向无根树,节点编号从 0 到 n - 1 给你整数 n 和一个长度为 n - 1 的二维整数数组 edges , 其中 edges[i] =_数组_04

标签:int,coins,整数,next,queue,++,edges,节点
From: https://blog.51cto.com/moonfdd/7341399

相关文章

  • 2023-09-03:用go编写。给你一个 n 个节点的无向无根树,节点编号从 0 到 n - 1 给你整数
    2023-09-03:用go语言编写。给你一个n个节点的无向无根树,节点编号从0到n-1给你整数n和一个长度为n-1的二维整数数组edges,其中edges[i]=[ai,bi]表示树中节点ai和bi之间有一条边。再给你一个长度为n的数组coins,其中coins[i]可能为0也可能为1,1......
  • mongodb副本集(仲裁模式)修改各节点ip(update方式)
    环境:OS:Centos7mongodb:5.0当前的ip  变更后的ip192.168.1.105192.168.1.108PRIMARY192.168.1.106192.168.1.109SECONDARY192.168.1.107192.168.1.110ARBITER 1.查看当前的集群登录一个节点......
  • 编写判断一个正整数是否为素数的函数
    编写判断一个正整数是否为素数的函数自己搞的,还请斧正。#include <stdio.h>void  prime(int m);                         int main(){    int a[10],i;      for(i=0;i<10;i++)    {        scanf("%d",&a[......
  • mongodb副本集(非仲裁模式)修改各节点ip(update方式)
    环境:OS:Centos7mongodb:5.0当前的ip变更后的ip192.168.1.108192.168.1.105   PRIMARY192.168.1.109192.168.1.106   SECONDARY192.168.1.110192.168.1.107   SECONDARY 1.查看当前的集群登录一个节点上查......
  • 分布式存储FusionStorage将搬迁走的计算节点踢出集群
    1、登录DeviceManager管理界面,在服务-vbs页面下,选中已经异常的VBS,将异常的VBS进行强制删除。2、通过第三方远程连接工具,连接进FSM后台,IP为浮动IP,用fsadmin用户进入,切换到root用户。fsadmin默认密码:IaaS@OS-CLOUD9!2.1执行su- rootroot默认密码:IaaS@OS-CLOUD8!3、执行ism......
  • JavaScript—节点
    节点的概念节点:网页中的所有内容都是节点,例如标签、属性、文本、注释、回车、换行、空格等。节点属性:可以用标签--元素.出来,可以使用属性节点.出来,文本节点.点出来。nodeType:节点的类型:1-标签DIV-12-属性:class3-文本:innerTextnodeName:节点的名字:标签节点-大写的......
  • 为什么创建 Redis 集群时会自动错开主从节点?
    哈喽大家好,我是咸鱼在《一台服务器上部署Redis伪集群》这篇文章中,咸鱼在创建Redis集群时并没有明确指定哪个Redis实例将担任master,哪个将担任slave/usr/local/redis-4.0.9/src/redis-trib.rbcreate--replicas1192.168.149.131:6379192.168.149.131:26379192.168.1......
  • 【MongoDB】副本集通过一致性备份增加新节点
    [mongod@node01~]#opensslrand-base64666>/var/lib/mongo/keyfile[mongod@node01~]#chownmongod:mongod/var/lib/mongo/keyfile[mongod@node01~]#chmod600/var/lib/mongo/keyfile[mongod@node01~]#l/var/lib/mongo/keyfile-rw-------1mongodmongo......
  • 剑指 Offer 16. 数值的整数次方
    根本思想就是二进制能够表示任意类型的数。classSolution{public:doublemyPow(doublex,intn){//为了防止判断n为负数取反时造成溢出//用longlong类型接收longlongN=n;//记录N是否是负数intflag=0;......
  • sqlserver 循环 + 递归 修改 末节点 标识
    DECLARE@cntINT=0;WHILE@cnt<27BEGINSET@cnt=@cnt+1;PRINT@cnt;withtemp(id,[Name],ParentCategriesID)as(selectid,[Name],ParentCategriesIDfromCategorieswhereid=27unionallselecta.id,a.[Name],a.ParentCategriesI......