【Lintcode】1718. Minimize Malware Spread
生活随笔
收集整理的這篇文章主要介紹了
【Lintcode】1718. Minimize Malware Spread
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目地址:
https://www.lintcode.com/problem/minimize-malware-spread/description
給定一個nnn個節點的無向圖,以鄰接矩陣給出。每個節點代表一個網絡中的節點。再給定一個數組AAA,A[i]A[i]A[i]表示節點iii被感染了(下文稱AAA里的點是”感染源“)。當一個節點被感染了,它所在的連通塊的所有節點都會被感染。現在允許選取一個“感染源”,將其變為”未感染“。問將哪個節點變為”未感染“可以使得剩余節點的總的被感染節點數量最小。如果有多個答案,則返回編號最小的節點。
思路可以參考https://blog.csdn.net/qq_46105170/article/details/113488695,那里是用并查集做的。這里采用DFS來做。
依然是要找到感染源只有一個的連通塊,那么這樣的連通塊的最大size對應的感染源就是答案(多個解則取編號最小者)。如果不存在這樣的連通塊,則直接取感染源的編號最小者。這里可以用DFS將每個連通塊染色,然后統計每個顏色的節點數,和每個顏色的污染源數。相同顏色的點顯然就是個連通塊。然后按上面邏輯求解即可。代碼如下:
import java.util.Arrays;public class Solution {/*** @param graph: the node graph* @param initial: the infected node* @return: the node index*/public int minMalwareSpread(int[][] graph, int[] initial) {// write your code here.int n = graph.length;// colors[i]存編號為i的節點被染上的顏色int[] colors = new int[n];Arrays.fill(colors, -1);int color = 0;for (int i = 0; i < n; i++) {if (colors[i] == -1) {dfs(i, color++, colors, graph);}}// size[i]存被染了顏色i的節點有多少個int[] size = new int[color];for (int i : colors) {size[i]++;}// malCount[i]存被染了顏色i的連通塊里的感染源有多少個int[] malCount = new int[color];for (int i : initial) {malCount[colors[i]]++;}int res = -1, maxSaved = 0;for (int v : initial) {// 略過含多個污染源的連通塊if (malCount[colors[v]] != 1) {continue;}if (size[colors[v]] > maxSaved) {maxSaved =size[colors[v]];res = v;} else if (size[colors[v]] == maxSaved) {res = Math.min(res, v);}}if (res == -1) {res = n;for (int i : initial) {res = Math.min(res, i);}}return res;}private void dfs(int v, int color, int[] colors, int[][] graph) {colors[v] = color;for (int next = 0; next < graph[v].length; next++) {if (graph[v][next] == 1 && colors[next] == -1) {dfs(next, color, colors, graph);}}} }時間復雜度O(n2)O(n^2)O(n2),空間O(n)O(n)O(n)。
總結
以上是生活随笔為你收集整理的【Lintcode】1718. Minimize Malware Spread的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python四大器_Python程序库中
- 下一篇: 联发科技:LinkIt™ RTOS