|
|
|
Граф, алгоритм Прима (Дейкстры-Прима)
|
|||
|---|---|---|---|
|
#18+
Пишу в этот раздел, т.к. задача алгоритмическая, сказали тут быстрее помогут столкнулась с такой проблемой, есть алгоритм для нахождения миним. остовного дерева, мне нужно максимального, и в качестве вывода лучше не сумму а произведение вот код алгоритма Прима: [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 день мучаюсь с этим ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.12.2013, 14:28 |
|
||
|
Граф, алгоритм Прима (Дейкстры-Прима)
|
|||
|---|---|---|---|
|
#18+
Ну так а проблема то в чем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.12.2013, 00:18 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=38507904&tid=1341535]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
46ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 206ms |
| total: | 347ms |

| 0 / 0 |
