• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Помогите с программой

  • Автор темы Автор темы Inn
  • Дата начала Дата начала

Inn

Ученик
Регистрация
4 Мар 2012
Сообщения
9
Реакции
0
Баллы
0
Помогите с программой

Помогите пожалуйста с программой. Надо написать программу для нахождения фундаментальных циклов в графе. Где-то нашла такую информацию,что за шаблон можно принять задачу о коммивояжере и изменить там немного,чтобы она выводила не минимальный цикл,а все.
Билась над ней дня 2,ничего не придумала,все равно выводит минимальный цикл. Помогите кто может,что тут надо поменять?Программа на Java...

Код:
import java.util.*;
public class Cycle {
  public static int getCycle(int[][] dist) {
    int n = dist.length;
    int[][] dp = new int[1 << n][n];
    for (int[] d : dp)
      Arrays.fill(d, Integer.MAX_VALUE / 2);
    dp[1][0] = 0;
    for (int mask = 1; mask < 1 << n; mask += 2) {
      for (int i = 1; i < n; i++) {
        if ((mask & 1 << i) != 0) {
          for (int j = 0; j < n; j++) {
            if ((mask & 1 << j) != 0) {
              dp[mask][i] =dp[mask ^ (1 << i)][j] + dist[j][i];
            }
          }
        }
      }
    }
    int res = Integer.MAX_VALUE;
    for (int i = 1; i < n; i++) {
      res = dp[(1 << n) - 1][i] + dist[i][0];
    }

    // reconstruct path
    int cur = (1 << n) - 1;
    int[] order = new int[n];
    int last = 0;
    for (int i = n - 1; i >= 1; i--) {
      int bj = -1;
      for (int j = 1; j < n; j++) {
        if ((cur & 1 << j) != 0 && (bj == -1 || dp[cur][bj] + dist[bj][last] > dp[cur][j] + dist[j][last])) {
          bj = j;
        }
      }
      order[i] = bj;
      cur ^= 1 << bj;
      last = bj;
    }
    System.out.println(Arrays.toString(order));
    return res;
  }

  // Usage example
  public static void main(String[] args) {
    int[][] dist = { { 0, 1, 10, 1, 10 }, { 1, 0, 10, 10, 1 }, { 10, 10, 0, 1, 1 }, { 1, 10, 1, 0, 10 },
        { 10, 1, 1, 10, 0 } };
    System.out.println(5 == getCycle(dist));
  }
}
 
Назад
Сверху