Suma de los elementos mínimos en todos los componentes conectados de un grafo no dirigido

Amir na:

En una ciudad, hay npersonas y cada persona tiene unos amigos en la ciudad. (si a es amigo de b entonces b es también amigo de un) Queremos difundir un rumor entre estas personas, sino que dice el rumor de que cada persona tiene un costo c_ipero después de eso, la persona que se extendió el rumor entre todos sus amigos .

Queremos encontrar el mínimo coste para difundir el rumor de que todas las personas en la ciudad. En la entrada tenemos n: número de personas. m: Número de relaciones. a continuación, nlos números enteros c_i: el costo de decir que el rumor a persona iy luego en mlíneas, se obtienen dos números enteros u, ven cada línea que indica u,vson amigos. (Tenga en cuenta que el número de la persona que empezar de 1a n, pero en arreglos que tenemos de 0a n-1)

también n,m<=10E5yc_i<=10E9

Creo que este problema es equivalente a la suma de los elementos mínimos en todos los componentes conectados de un grafo no dirigido.

He encontrado una solución para ello en Internet con C ++ pero quería escribirlo en Java y por lo escribí el siguiente programa usando DFS. El problema es que cuando presente la respuesta a un juez de línea en el sitio donde encontré la pregunta, que sólo tiene que pasar solamente 3 de 20 pruebas. Quiero saber qué parte de mi solución no es correcta?

(El sitio no está en Inglés y en realidad es un sistema juez de línea de una universidad, pero si lo desea, puedo enlazar con el sitio)

Código final que trabaja completamente bien:

import java.util.LinkedList;
import java.util.Scanner;

class Graph {
    int numberOfVertices;
    LinkedList<Integer>[] graph;
    boolean[] visited;
    long[] costs;

    Graph(int numberOfVertices,long[] costs) {
        this.numberOfVertices = numberOfVertices;
        this.graph = new LinkedList[numberOfVertices];
        for (int v = 0; v < numberOfVertices; v++) {
            graph[v] = new LinkedList<Integer>();
        }

        this.costs=costs;
        this.visited = new boolean[numberOfVertices];

    }

    void addEdge(int u, int v) {
        graph[u].add(v);
        graph[v].add(u);
    }

    long dfs(int node, long mini) {
        // Stores the minimum
        mini = Math.min(mini, costs[ node]);

        // Marks node as visited
        visited[ node] = true;

        // Traversed in all the connected nodes
        for (int i : graph[ node]) {
            if (!visited[ i])
                mini = dfs(i, mini);
        }

        return mini;
    }

    void minimumSumConnectedComponents() {
        // Initially sum is 0
        long sum = 0L;

        // Traverse for all nodes
        for (int i = 0; i < numberOfVertices; i++) {
            if (!visited[i]) {
                sum += dfs(i, costs[i]);
            }
        }

        // Returns the answer

        System.out.println(sum);
    }
}




public class Main {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int numberOfVertices,numberOfRelations;
        numberOfVertices=input.nextInt();
        numberOfRelations=input.nextInt();
        long [] costs = new long[numberOfVertices];
        for (int i =0;i<numberOfVertices;i++)
        {
            costs[i]=input.nextLong();
        }
        Graph g = new Graph(numberOfVertices,costs);
        for (int i =0;i<numberOfRelations;i++)
        {
            int v1,v2;
            v1=input.nextInt();
            v2=input.nextInt();
            g.addEdge(v1-1,v2-1);
        }
         g.minimumSumConnectedComponents();

    }
}

Código de edad, que tiene algunos problemas:

import java.util.Scanner;
import java.util.Vector;

class Graph {
    Integer numberOfVertices;
    Vector<Integer>[] graph;
    boolean[] visited;
    Long[] costs;

    Graph(Integer numberOfVertices,Long[] costs) {
        this.numberOfVertices = numberOfVertices;
        this.graph = new Vector[numberOfVertices];
        for (Integer v = 0; v < numberOfVertices; v++) {
            graph[v] = new Vector<Integer>();
        }
        this.costs = new Long[numberOfVertices];
        for (Integer v = 0; v < numberOfVertices; v++) {
            this.costs[v] = costs[v];
        }
        this.visited = new boolean[numberOfVertices];

    }

    void addEdge(Integer u, Integer v) {
        graph[u].add(v);
        graph[v].add(u);
    }

    void dfs(Integer node, Long mini) {
        // Stores the minimum
        mini = Math.min(mini, costs[(Integer) node]);

        // Marks node as visited
        visited[(Integer) node] = true;

        // Traversed in all the connected nodes
        for (Integer i : graph[(Integer) node]) {
            if (!visited[(Integer) i])
                dfs(i, mini);
        }
    }

    void minimumSumConnectedComponents() {
        // Initially sum is 0
        Long sum = 0L;

        // Traverse for all nodes
        for (Integer i = 0; i < numberOfVertices; i++) {
            if (!visited[i]) {
                Long mini = costs[i];
                dfs(i, mini);
                sum += mini;
            }
        }

        // Returns the answer

        System.out.println(sum);
    }
}




public class Main {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        Integer numberOfVertices,numberOfRelations;
        numberOfVertices=input.nextInt();
        numberOfRelations=input.nextInt();
        Long [] costs = new Long[numberOfVertices];
        for (Integer i =0;i<numberOfVertices;i++)
        {
            costs[i]=input.nextLong();
        }
        Graph g = new Graph(numberOfVertices,costs);
        for (Integer i =0;i<numberOfRelations;i++)
        {
            Integer v1,v2;
            v1=input.nextInt();
            v2=input.nextInt();
            g.addEdge(v1-1,v2-1);
        }
         g.minimumSumConnectedComponents();

    }
}

Casos de prueba de muestra:

5 2
2 5 3 4 8
1 4
4 5

Expected Output: 10

10 0
1 2 3 4 5 6 7 8 9 10

Expected Output: 55

10 5
1 6 2 7 3 8 4 9 5 10
1 2
3 4
5 6
7 8
9 10

Expected Output: 15

Mi programa de pasar esta prueba de muestra de los casos, pero se pone respuesta equivocada para una gran cantidad de casos de prueba desconocidos.

David Eisenstat:

Estas líneas no hacen lo que quiere:

    // Stores the minimum
    mini = Math.min(mini, costs[(Integer) node]);

Si se mutaron los de la persona que llama mini, entonces su código parece otra manera correcta (suponiendo que no haya desbordamientos de pila). Mi sugerencia sería volver el nuevo valor de minila persona que llama uso:

Long dfs(Integer node, Long mini) {
    // Stores the minimum
    mini = Math.min(mini, costs[(Integer) node]);

    // Marks node as visited
    visited[(Integer) node] = true;

    // Traversed in all the connected nodes
    for (Integer i : graph[(Integer) node]) {
        if (!visited[(Integer) i])
            mini = dfs(i, mini);
    }

    return mini;
}

void minimumSumConnectedComponents() {
    // Initially sum is 0
    Long sum = 0L;

    // Traverse for all nodes
    for (Integer i = 0; i < numberOfVertices; i++) {
        if (!visited[i]) {
            sum += dfs(i, costs[i]);
        }
    }

    // Returns the answer

    System.out.println(sum);
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=191441&siteId=1
Recomendado
Clasificación