Unidad 5 - emilioone05/Analisis_Algoritmos_utpl GitHub Wiki
Los algoritmos de grafos son herramientas fundamentales en ciencias de la computación, utilizados para resolver problemas de optimización en redes complejas. Este documento explora tres algoritmos clave: Prim, Dijkstra y Kruskal, destacando sus características, implementaciones y aplicaciones prácticas.
El algoritmo de Prim construye un MST agregando iterativamente la arista de menor peso que conecta un nodo incluido con uno no incluido.
- Tipo de grafo: No dirigido, conexo, ponderado
- Estrategia: Voraz (greedy)
- Complejidad: O(E log V) con heap binario
- Ventajas: Eficiente para grafos densos
import java.util.*;
public class KruskalMST {
static class Edge implements Comparable<Edge> {
int src, dest, weight;
public Edge(int src, int dest, int weight) {
this.src = src;
this.dest = dest;
this.weight = weight;
}
@Override
public int compareTo(Edge other) {
return this.weight - other.weight;
}
}
static class DisjointSet {
int[] parent, rank;
public DisjointSet(int size) {
parent = new int[size];
rank = new int[size];
for (int i = 0; i < size; i++) {
parent[i] = i;
}
}
public int find(int x) {
if (parent[x] != x) {
parent[x] = find(parent[x]);
}
return parent[x];
}
public void union(int x, int y) {
int rootX = find(x);
int rootY = find(y);
if (rootX == rootY) return;
if (rank[rootX] < rank[rootY]) {
parent[rootX] = rootY;
} else if (rank[rootX] > rank[rootY]) {
parent[rootY] = rootX;
} else {
parent[rootY] = rootX;
rank[rootX]++;
}
}
}
public static void kruskalMST(int vertices, List<Edge> edges) {
Collections.sort(edges);
DisjointSet ds = new DisjointSet(vertices);
List<Edge> result = new ArrayList<>();
int totalWeight = 0;
for (Edge edge : edges) {
if (ds.find(edge.src) != ds.find(edge.dest)) {
ds.union(edge.src, edge.dest);
result.add(edge);
totalWeight += edge.weight;
}
}
System.out.println("Aristas en el MST:");
for (Edge edge : result) {
System.out.println(edge.src + " - " + edge.dest + " : " + edge.weight);
}
System.out.println("Peso total del MST: " + totalWeight);
}
public static void main(String[] args) {
int V = 4;
List<Edge> edges = new ArrayList<>();
edges.add(new Edge(0, 1, 10));
edges.add(new Edge(0, 2, 6));
edges.add(new Edge(0, 3, 5));
edges.add(new Edge(1, 3, 15));
edges.add(new Edge(2, 3, 4));
kruskalMST(V, edges);
}
}
import java.util.*;
public class PrimMST {
static class Node implements Comparable<Node> {
int vertex, key;
public Node(int vertex, int key) {
this.vertex = vertex;
this.key = key;
}
@Override
public int compareTo(Node other) {
return this.key - other.key;
}
}
public static void primMST(int[][] graph) {
int V = graph.length;
int[] parent = new int[V];
int[] key = new int[V];
boolean[] mstSet = new boolean[V];
Arrays.fill(key, Integer.MAX_VALUE);
key[0] = 0;
parent[0] = -1;
PriorityQueue<Node> pq = new PriorityQueue<>();
pq.add(new Node(0, key[0]));
while (!pq.isEmpty()) {
int u = pq.poll().vertex;
mstSet[u] = true;
for (int v = 0; v < V; v++) {
if (graph[u][v] != 0 && !mstSet[v] && graph[u][v] < key[v]) {
parent[v] = u;
key[v] = graph[u][v];
pq.add(new Node(v, key[v]));
}
}
}
System.out.println("Aristas en el MST:");
for (int i = 1; i < V; i++) {
System.out.println(parent[i] + " - " + i + " : " + graph[i][parent[i]]);
}
}
public static void main(String[] args) {
int[][] graph = new int[][] {
{0, 2, 0, 6, 0},
{2, 0, 3, 8, 5},
{0, 3, 0, 0, 7},
{6, 8, 0, 0, 9},
{0, 5, 7, 9, 0}
};
primMST(graph);
}
}
import java.util.*;
public class DijkstraShortestPath {
static class Node implements Comparable<Node> {
int vertex, distance;
public Node(int vertex, int distance) {
this.vertex = vertex;
this.distance = distance;
}
@Override
public int compareTo(Node other) {
return this.distance - other.distance;
}
}
public static void dijkstra(int[][] graph, int src) {
int V = graph.length;
int[] dist = new int[V];
int[] prev = new int[V];
Arrays.fill(dist, Integer.MAX_VALUE);
Arrays.fill(prev, -1);
dist[src] = 0;
PriorityQueue<Node> pq = new PriorityQueue<>();
pq.add(new Node(src, 0));
while (!pq.isEmpty()) {
int u = pq.poll().vertex;
for (int v = 0; v < V; v++) {
if (graph[u][v] != 0 && dist[u] != Integer.MAX_VALUE &&
dist[u] + graph[u][v] < dist[v]) {
dist[v] = dist[u] + graph[u][v];
prev[v] = u;
pq.add(new Node(v, dist[v]));
}
}
}
System.out.println("Distancias desde el nodo " + src + ":");
for (int i = 0; i < V; i++) {
System.out.print("Nodo " + i + ": " + dist[i] + ", Camino: ");
printPath(prev, i);
System.out.println();
}
}
private static void printPath(int[] prev, int v) {
if (v < 0) return;
printPath(prev, prev[v]);
System.out.print(v + " ");
}
public static void main(String[] args) {
int[][] graph = new int[][] {
{0, 4, 0, 0, 0, 0, 0, 8, 0},
{4, 0, 8, 0, 0, 0, 0, 11, 0},
{0, 8, 0, 7, 0, 4, 0, 0, 2},
{0, 0, 7, 0, 9, 14, 0, 0, 0},
{0, 0, 0, 9, 0, 10, 0, 0, 0},
{0, 0, 4, 14, 10, 0, 2, 0, 0},
{0, 0, 0, 0, 0, 2, 0, 1, 6},
{8, 11, 0, 0, 0, 0, 1, 0, 7},
{0, 0, 2, 0, 0, 0, 6, 7, 0}
};
dijkstra(graph, 0);
}
}