Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 14.10.2016
Сообщений: 8

Дома в Берляндии

04.01.2017, 16:12. Показов 1427. Ответов 8
Метки java (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, не могу никак решить эту задачу. Просто не представляю что делать и как делать. Помогите пожалуйста. Напишите хотя бы главные аспекты кода, который здесь понадобится. Заранее огромное спасибо.

Как известно, в столице Берляндии есть n перекрёстков. На некоторых их этих перекрёстков
находятся жилые дома. Пусть ai — это количество человек в семье, проживающей в доме, который
находится на перекрёстке i для всех 1 ⩽ i ⩽ n. Если ai равно нулю, будем считать, что на этом i-м
перекрёстке нет жилого дома.
Некоторые перекрёстки соединены дорогами. Всего в Берляндии m дорог. По каждой дороге
можно ходить в любом направлении. Каждая дорога соединяет два различных перекрёстка. Любые
два перекрёстка соединены не более чем одной дорогой. От любого перекрёстка можно добраться
по дорогам города до любого другого перекрёстка. Назовём расстоянием между перекрёстками i и
j минимальное количество дорог, по которым нужно пройти, чтобы добраться от перекрёстка i до
перекрёстка j.
Когда одна семья ходит в гости к другой семье, каждый человек находит себе ровно одного
собеседника из другой семьи, и они вдвоем разговаривают между собой. Двум семья общаться
скучно, если какой-то человек останется без собеседника.
По какой-то непонятной причине правительство Берляндии попросило вас найти два ближайших
жилых дома v и u, таких что если семья из дома v придёт в гости к семье из дома u, то им будет
скучно общаться, то есть av > 0, au > 0, av != au и расстояние от v до u минимально. Гарантируется,
что существуют два жилых дома с различным количеством жильцов.

Формат входных данных
В первой строке входных данных заданы числа n и m (2 ⩽ n ⩽ 1 000 000, 1 ⩽ m ⩽ 1 000 000) —
количество перекрёстков в столице Берляндии и количество двунаправленных дорог соответственно.
Во второй строке входных данных заданы n чисел (0 ⩽ ai ⩽ 109
), где ai равно 0, если на i-
м перекрёстке нет жилого дома, или ai равно количеству человек в семье, проживающей в доме,
который находится на i-м перекрёстке.
В следующих m строках заданы дороги. В i-й из этих строк заданы два числа vi и ui
(1 ⩽ vi
, ui ⩽ n, vi != ui) — номера перекрёстков, соединённых соответствующей дорогой.

Формат выходных данных
В единственной строке выведите одно целое число — минимальное расстояние между двумя
жилыми домами с различным количеством жильцов.

Примеры
Ввод:
4 4
1 0 2 0
1 2
2 3
3 4
4 1
Вывод:
2


Ввод:
5 4
1 0 2 1 0
1 5
4 5
5 2
2 3
Вывод:
3

Добавлено через 9 минут
Написал лишь это, а на большее меня не хватает

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.io.PrintWriter;
import java.util.Scanner;
 
public class C {
    
    static Scanner in = new Scanner(System.in);
    static PrintWriter out = new PrintWriter(System.out);
    
    public static void main(String[] args) {
 
        int kolvoPer = in.nextInt();
        int kolvoDor = in.nextInt();
        
        int[] chel = new int[kolvoPer];
        for (int i = 0; i < kolvoPer; i++){
            chel[i] = in.nextInt(); 
        }
        
        int[][] per;
        per = new int[kolvoDor][2];
        for (int i = 0; i < kolvoDor; i++) {
            for (int j = 0; j < 2; j++) {
                per[i][j] = in.nextInt();
            }
        }
 
 
        }
        
    
    }
Добавлено через 6 часов 55 минут
Вот до этого я пока что додумался. С примерами работает верно, но компилятор показывает, что это все равное не верное решение. Можете хотя бы проверить что не так? Где я ошибся?

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import java.io.PrintWriter;
import java.util.Scanner;
 
public class C {
    
    static Scanner in = new Scanner(System.in);
    static PrintWriter out = new PrintWriter(System.out);
    
    public static void main(String[] args) {
 
        int kolvoPer = in.nextInt();
        int kolvoDor = in.nextInt();
        
        int[] chel = new int[kolvoPer];
        for (int i = 0; i < kolvoPer; i++){
            chel[i] = in.nextInt(); 
        }
        
        int[][] per;
        per = new int[kolvoDor][2];
        for (int i = 0; i < kolvoDor; i++) {
            for (int j = 0; j < 2; j++) {
                per[i][j] = in.nextInt();
            }
        }
        
        int n = 0; 
        int m = 0; 
        
        for (int i = 0; i < kolvoPer - 1; i++) {
            for (int j = i + 1; j < kolvoPer; j++) {
                
                if ((chel[i] != chel[j]) && (chel[i] != 0) && (chel[j] != 0)){
                    n = i;
                    m = j;
                }
            }
            
        }
        
 
        int dor = 0;
        
            for (int j = 0; j < m; j++) {
                dor++;
            }   
            
       out.println(dor);
      in.close();
      out.close();
      
       }
        }
Добавлено через 17 часов 11 минут
Ладно, я понял, что тут нужно реализовать алгоритм поиска либо в длину, либо в ширину. Помогите, пожалуйста, я не понимаю эти алгоритмы. Напишите их пожалуйста для конкретно этого кода. Очень прошу
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.01.2017, 16:12
Ответы с готовыми решениями:

Дома в Берляндии (рёбра, графы)
Здравствуйте! Подскажите пожалуйста каким образом можно решить эту задачу? Изложите алгоритм в нескольких словах. Как известно, в...

У меня и дома и на работа роутер керио стоит, как использовать рабочий интернет от дома?
У меня и дома и на работа роутер керио стоит, на работе у нас интернет без лимит и с 4м\бит скорость, а дома у меня ограниченные траффик...

Построить на экране рисунок одно подъездного дома, если известны координаты левого верхнего угла дома
Построить на экране рисунок одно подъездного дома, если известны координаты левого верхнего угла дома, ширина и высота этажа. (дом должен...

8
3 / 3 / 5
Регистрация: 18.07.2012
Сообщений: 89
04.01.2017, 23:39
Привет я так понял это олимпийское программирование
Сейчас поздно завтра еще раз перечитаю
но на первый взгляд
Здесь нужно использовать алгоритм флойда
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.io.PrintWriter;
import java.util.Scanner;
 
public class C {
    
    static Scanner in = new Scanner(System.in);
    static PrintWriter out = new PrintWriter(System.out);
    
    public static void main(String[] args) {
 
        int kolvoPer = in.nextInt();
        int kolvoDor = in.nextInt();
        
        int[] chel = new int[kolvoPer];
        for (int i = 0; i < kolvoPer; i++){
            chel[i] = in.nextInt(); 
        }
        for(int i =0; i < 
 
        for (int k=0; k<n; ++k)
    for (int i=0; i<n; ++i)
        for (int j=0; j<n; ++j)
            d[i][j] = min (d[i][j], d[i][k] + d[k][j]);
 
       out.println(dor);
      in.close();
      out.close();
      
       }
        }
0
0 / 0 / 0
Регистрация: 14.10.2016
Сообщений: 8
05.01.2017, 18:14  [ТС]
Цитата Сообщение от pizz333 Посмотреть сообщение
Здесь нужно использовать алгоритм флойда
Я уже говорил, что не понимаю их. Ну я подставил вроде, выводит ошибку:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException : 2
at pocket.C.main(C.java:48)

Код вот такой сейчас. Вроде бы правильно подставил:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import java.io.PrintWriter;
import java.util.Scanner;
 
 
public class C {
    
    static Scanner in = new Scanner(System.in);
    static PrintWriter out = new PrintWriter(System.out);
    
    public static void main(String[] args) {
 
        int kolvoPer = in.nextInt();
        int kolvoDor = in.nextInt();
        
        int[] chel = new int[kolvoPer];
        for (int i = 0; i < kolvoPer; i++){
            chel[i] = in.nextInt(); 
        }
        
        int[][] per;
        per = new int[kolvoDor][2];
        for (int i = 0; i < kolvoDor; i++) {
            for (int j = 0; j < 2; j++) {
                
                per[i][j] = in.nextInt();
        
            }
        }
        
        int i_1 = 0; 
        int j_1 = 0; 
        
        for (int i = 0; i < kolvoPer - 1; i++) {
            for (int j = i + 1; j < kolvoPer; j++) {
                
                if ((chel[i] != chel[j]) && (chel[i] != 0) && (chel[j] != 0)){
                    i_1 = i;
                    j_1 = j;
                }
            }
        }
        
        for (int k = 0; k < kolvoPer; ++k){
            for (int i = 0; i < kolvoPer; ++i){
                for (int j = 0; j < kolvoPer; ++j){
                    per[i][j] = Math.min(per[i][j], per[i][k] + per[k][j]);
         out.println(per[i][j]);
                }
                }
            }
      in.close();
      out.close();
      
       }
    }
0
3 / 3 / 5
Регистрация: 18.07.2012
Сообщений: 89
06.01.2017, 10:04
сорян я не ту версию кода скинул
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.util.Scanner;
public class test {
    private static Scanner in;
 
    public static void main(String[] args) {
        int n, m, a, b, INF = Integer.MAX_VALUE, min = INF;
        in = new Scanner(System.in);
        n = in.nextInt();
        m = in.nextInt();
        int[][] g = new int[n][n];
        int[] d = new int[n];
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                g[i][j] = INF;
        for (int i = 0; i < n; i++) {
            d[i] = in.nextInt();
        }
        for (int i = 0; i < m; i++) {
            a = in.nextInt() - 1;
            b = in.nextInt() - 1;
            g[a][b] = 1;
            g[b][a] = 1;
        }
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                for (int k = 0; k < n; k++) {
                    if (g[i][k] < INF && g[k][j] < INF)
                        g[i][j] = Math.min(g[i][j], g[i][k] + g[k][j]);
                    if(d[i] != d[j] && d[i] != 0 && d[j] != 0 && min > g[i][j])
                        min = g[i][j];
                }
 
        System.out.println(min);
    }
}
Алгоритм очень простой он ищет самый короткий путь от каждой вершины до каждой
Если вы не хотите разбираться я вам не помогу.

Добавлено через 4 минуты
Вы кстати от куда задачу взяли берляндия и все остальное вроде кодфорсовская фишка?
0
0 / 0 / 0
Регистрация: 14.10.2016
Сообщений: 8
06.01.2017, 14:19  [ТС]
Цитата Сообщение от pizz333 Посмотреть сообщение
Вы кстати от куда задачу взяли берляндия и все остальное вроде кодфорсовская фишка?
Олимпиада при МФТИ. При проверке говорит что пройдены не все тесты. Превышено максимальное время работы
0
3 / 3 / 5
Регистрация: 18.07.2012
Сообщений: 89
06.01.2017, 18:32
Попробуй это оптимизация для разряженных графов

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
import java.util.ArrayList;
import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Scanner;
 
class pair implements Comparable<pair> {
    int dist;
    int to;
 
    public pair() {
    }
 
    public pair(int dist, int to) {
 
        this.dist = dist;
        this.to = to;
    }
 
    @Override
    public int compareTo(pair o) {
        return Integer.compare(dist, o.dist);
    }
 
    @Override
    public boolean equals(Object obj) {
        if (obj instanceof pair) {
            return dist == ((pair) obj).dist && to == ((pair) obj).to;
        }
        return false;
    }
}
 
public class test {
    static ArrayList<Integer>[] g;
    static int[] house;
    private static Scanner in;
    static int INF = Integer.MAX_VALUE;
 
    public static int diecstra(int s, int min) {
        int[] d = house.clone();
        Arrays.fill(d,INF);
        d[s] = 0;
        PriorityQueue<pair> q = new PriorityQueue<>();
        q.add(new pair(d[s], s));
        while (!q.isEmpty()) {
            int v = q.poll().to;
            for (int j = 0; j < g[v].size(); j++) {
                int to = g[v].get(j);
                if (d[v] + 1 < d[to]) {
                    q.remove(new pair(d[to], to));
                    d[to] = d[v] + 1;
                    q.add(new pair(d[to], to));
                }
                if (house[s] != house[to] && house[to] != 0 && min > d[to])
                    min = d[to];
            }
        }
        return min;
    }
 
    public static void main(String[] args) {
        int n, m, a, b,  min = INF;
        in = new Scanner(System.in);
        n = in.nextInt();
        m = in.nextInt();
        g = new ArrayList[n];
        for (int i = 0; i < n; i++) {
            g[i] = new ArrayList<>();
        }
        house = new int[n];
        for (int i = 0; i < n; i++) {
            house[i] = in.nextInt();
        }
        for (int i = 0; i < m; i++) {
            a = in.nextInt() - 1;
            b = in.nextInt() - 1;
            g[a].add(b);
            g[b].add(a);
        }
        int temp;
        for (int i = 0; i < n; i++)
            if (house[i] != 0) {
                temp = diecstra(i, min);
                if (min > temp)
                    min = temp;
            }
        System.out.println(min);
    }
}
Добавлено через 28 секунд
Можешь скинуть все задачи охото почитать
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
06.01.2017, 18:48
pizz333, переменные называй нормально, используй геттеры/сеттеры, почитай конвенции, Дейкстра пишется так: Dijkstra
0
0 / 0 / 0
Регистрация: 14.10.2016
Сообщений: 8
06.01.2017, 18:55  [ТС]
Цитата Сообщение от pizz333 Посмотреть сообщение
Попробуй это оптимизация для разряженных графов
Ошибка компиляции
"/usr/local/jdk7/bin/javac" -source 1.7 -Xlint:unchecked pair.java
pair.java:33: error: class test is public, should be declared in a file named test.java
public class test {
^
pair.java:66: warning: [unchecked] unchecked conversion
g = new ArrayList[n];
^
required: ArrayList<Integer>[]
found: ArrayList[]
1 error
1 warning
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
07.01.2017, 00:39
555JustSpace555, читать не пытался, человеческим языком же говорит, что сделать надо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.01.2017, 00:39
Помогаю со студенческими работами здесь

Найдите, какое количество лет Васе еще нужно служить в армии Берляндии
Помогите решить задачу: Система Вооруженных Сил Берляндии состоит из n званий, которые пронумерованы натуральными числами от 1 до n, где...

Каков номер дома Петра? Каков номер дома школы?
Здравствуйте, можете помочь с решением задачи на JavaScript? Школа находится на одной стороне улицы с домом Петра. Однажды по дороге в...

WI-FI дома
Здравствуйте. Как сделать wi-fi интернет дома,без подключения интернет кабеля к компу? Какое оборудование нужно приобрести? и как его...

Wi-fi для дома
Добрый ночи! Недавно купил телефон samsung galaxy 5830 ace ,начал закачивать игры (из интернета!) ,многие наверно знают,кто имеет...

Wi-fi на 2 соседних дома
Всем привет, прошу помощи, имеем 2 радом стоящих дома (мой и родителей) у меня дома стоит роутер tp-link tl-mr3220 с USB модемом Ёта. Из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru