powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Граф, алгоритм Прима (Дейкстры-Прима)
3 сообщений из 3, страница 1 из 1
Граф, алгоритм Прима (Дейкстры-Прима)
    #38506549
Констaнция
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пишу в этот раздел, т.к. задача алгоритмическая, сказали тут быстрее помогут
столкнулась с такой проблемой, есть алгоритм для нахождения миним. остовного дерева, мне нужно максимального, и в качестве вывода лучше не сумму а произведение
вот код алгоритма Прима:
[JAVA]
import java.util.*;

public class PrimHeap {

public static long mst(List<Edge>[] edges, int[] pred) {
int n = edges.length;
Arrays.fill(pred, -1);
boolean[] vis = new boolean[n];
int[] prio = new int[n];
Arrays.fill(prio, Integer.MAX_VALUE);
prio[0] = 1;
Queue<QItem> q = new PriorityQueue<QItem>();
q.add(new QItem(0, 0));
long res = 0;
while (!q.isEmpty()) {
QItem cur = q.poll();
int u = cur.u;
if (vis[u])
continue;

vis[u] = true;
res += cur.prio;
for (Edge e : edges[u]) {
int v = e.t;
if (!vis[v] && prio[v]>e.cost)
{
prio[v] = e.cost;
pred[v] = u;
q.add(new QItem(prio[v], v));
}
}
}
return res;
}

static class Edge {
int t, cost;

public Edge(int t, int cost) {
this.t = t;
this.cost = cost;
}
}

static class QItem implements Comparable<QItem> {
int prio;
int u;

public QItem(int prio, int u) {
this.prio = prio;
this.u = u;
}

public int compareTo(QItem q) {
return prio < q.prio ? -1 : prio > q.prio ? 1 : 0;
}
}

// Usage example
public static void main(String[] args) {
int[][] cost = { { 0, 2, 3 }, { 3 , 0, 2 }, { 2, 3, 0 } };

int n = cost.length;
List<Edge>[] edges = new List[n];
for (int i = 0; i < n; i++) {
edges[i] = new ArrayList<Edge>();
for (int j = 0; j < n; j++) {
if (cost[i][j] != 0) {
edges[i].add(new Edge(j, cost[i][j]));
} } }
long res = mst(edges, new int[n]);System.out.println("\n");
System.out.println("\nИмеет минимальное остовное дерево массой: ");
System.out.println(res);
}
}[/JAVA]

либо алгоритм Дейкстры, этот мне кажется получше будет,
[JAVA]
GraphAsMatrix(){// конструктор
System.out.print("Введите количество вершин графа N = ");
Scanner con = new Scanner(System.in);
N = con.nextInt();
edges = new double[N+1][N+1]; // чтобы нумерация была от 1
con.useLocale(Locale.US);
for (int i = 1; i <= N; i++){
System.out.println("\nВведите веса ребер для связи вершины № " + i + " c остальными:");
System.out.print(" ");
for(int j = 1; j <= N; j++){
System.out.printf("%5d", j);
} //for j
System.out.println();
System.out.print("Вес: ");
for (int j = 1; j <= N; j++){
edges[i][j] = con.nextDouble();
} // for j
edges[i][i] = 0;
}
System.out.print("\nВведите номер стартовой вершины: ");
startVertex = con.nextInt();

minDistances = new double [N+1];
} // конструктор

void d_alg(){
HashSet<Integer> second = new HashSet<Integer>();
for (int i = 1; i <= N; i++){
minDistances[i] = 0;
second.add(i);
}
minDistances[startVertex] = 0;

while (!second.isEmpty()) {
double minVal = 0;
int minVertex = 0; // задаем в качестве минимума несуществующую вершину
for (int v: second){
if (minDistances[v] >= minVal){
minVal = minDistances[v];
minVertex = v;
} // если нашли меньшее значение оценки пути
} // цикл по всем вершинам из второго множества

second.remove(minVertex); // удаляем вершину из множества
// а теперь обновляем оценки пути
for (int v: second){
if (edges[minVertex][v] > 0) {
minDistances[v] = Math.max(minDistances[v],//Math.max(minDistances[v],
minDistances[minVertex] + edges[minVertex][v]);
} // если с вершиной есть связь
} // цикл по всем вершинам из второго множества

} // while множество не пусто

} // d_alg

void printDistances(){
System.out.println("Минимальное расстояние от вершины " + startVertex + " " );
for (int i = 1; i <= N; i++){
System.out.println("до вершины " + i + ": " + minDistances[i]);
}
}
[/JAVA]


Пожалуйста, помогите, уже 4 день мучаюсь с этим
...
Рейтинг: 0 / 0
Граф, алгоритм Прима (Дейкстры-Прима)
    #38507257
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так а проблема то в чем?
...
Рейтинг: 0 / 0
Граф, алгоритм Прима (Дейкстры-Прима)
    #38507904
Фотография AlexandrPlus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Констaнция,

а чисто математически - заменить веса ребер на веса с обратным знаком?
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Граф, алгоритм Прима (Дейкстры-Прима)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]