Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.05.2010, 11:07   #1
shash
 
Регистрация: 13.05.2010
Сообщений: 3
По умолчанию графы(нуждаюсь в идее или объясните готовый код)

Условие задачи Острова
Ограничение по времени: 2 секунды
Ограничение по памяти: 64 мегабайта
Островное государство Исола состоит из n островов. Для удобства передвижения между
некоторыми островами были построены мосты, но чтобы никакой остров не был перегружен
транспортом, к каждому острову ведет не более двух мостов. По мосту можно проезжать в
обоих направлениях. Для получения средств на поддержание мостов и дорог правительство Исолы
установила плату за проезд по мосту в размере одной условной единицы.
До недавнего времени в Исоле не было автобусного сообщения. В срочном порядке была основана
первая автобусная компания «Коррейра», и решено проложить по автобусному маршруту между
каждой парой островов. Поскольку между некоторыми островами не существует пути по мостам,
между такими островами решено маршрут не создавать.
Было решено, что каждому маршруту будет совершаться два рейса в сутки: сначала в одном
направлении, а затем в обратном. Естественно автобусы всегда движутся по самому дешевому
маршруту. В «Коррейре» очень интересуются, сколько условных единиц в день будет уходить на
оплату проездов автобусов по мостам. Поскольку программистов в небольшом государстве Исолы
нет, компания просит Вас решить эту задачу.

Формат входного файла
В первой строке два целых числа n и m (1 <= n <= 100000; 0 <= m <= n) — количество островов и
мостов Исолы. Далее следует m строк, описывающих мосты Исолы. В каждой строке содержится
дваа целых числа x и y (1 <= x, y <= n; x != y) — номера островов, соединенных мостом. Гарантируется
что к каждому острову ведет не более двух мостов.

Формат выходного файла
В выходной файл выведите единственное целое число — количество условных единиц,
необходимых для работы автобусного сообщения.

Примеры
5 4
1 2
1 3
2 3
5 4
Ответ 8
В первом примере не все острова соединены между собой. От первого острова до второго можно
браться по одному мосту, от первого до третьего — один мост, от второго до третьего — один. До
твертого или пятого от первого, второго или третьего островов добраться по мостам нельзя. От
твертого до пятого — один мост. Итого 2(1 + 1 + 1 + 1) = 8 условных единиц.

5 4
5 4
4 3
3 2
2 1
Ответ 40
shash вне форума Ответить с цитированием
Старый 13.05.2010, 11:07   #2
shash
 
Регистрация: 13.05.2010
Сообщений: 3
По умолчанию

Код:
import java.io.*;
import java.util.*;
import java.math.*;
 
public class islands_aa {
 
    public static void main(String[] args) throws Throwable {
        new islands_aa().run();
    }
 
    BufferedReader br;
    StringTokenizer st;
    PrintWriter out;
    boolean eof = false;
    Random rand = new Random(this.hashCode());
 
    private void run() throws Throwable {
        Locale.setDefault(Locale.US);
        br = new BufferedReader(new FileReader(FNAME + ".in"));
        out = new PrintWriter(FNAME + ".out");
        solve();
        out.close();
    }
 
    String nextToken() {
        while (st == null || !st.hasMoreTokens()) {
            try {
                st = new StringTokenizer(br.readLine());
            } catch (Exception e) {
                eof = true;
                return "0";
            }
        }
        return st.nextToken();
    }
 
    int nextInt() {
        return Integer.parseInt(nextToken());
    }
 
    void myAssert(boolean u, String message) {
        if (!u) {
            throw new Error("Assertion failed!!! " + message);
        }
    }
 
    int inBounds(int x, int l, int r, String name) {
        myAssert(l <= x && x <= r, name + " not in bounds: " + x + " not in ["
                + l + ".." + r + "]");
        return x;
    }
 
    String FNAME = "islands";
 
    ArrayList<Integer>[] g;
    int[] c;
 
    private void solve() throws IOException {
        int n = inBounds(nextInt(), 1, 100000, "n");
        int m = inBounds(nextInt(), 0, n, "m");
        g = new ArrayList[n];
        for (int i = 0; i < g.length; i++) {
            g[i] = new ArrayList<Integer>();
        }
        while (m-- > 0) {
            int x = inBounds(nextInt(), 1, n, "x") - 1;
            int y = inBounds(nextInt(), 1, n, "y") - 1;
            myAssert(x != y, "x(" + x + ") == y(" + y + "!!!");
            g[x].add(y);
            g[y].add(x);
        }
        for (int i = 0; i < g.length; i++) {
            inBounds(g[i].size(), 0, 2, "deg(" + (i + 1) + ")");
        }
        c = new int[n];
        Arrays.fill(c, -1);
        int k = 0;
        for (int i = 0; i < c.length; i++) {
            if (c[i] < 0) {
                dfs(i, k++);
            }
        }
        long[] v = new long[k];
        long[] e = new long[k];
        for (int i = 0; i < c.length; i++) {
            v[c[i]]++;
            e[c[i]] += g[i].size();
        }
        for (int i = 0; i < e.length; i++) {
            e[i] /= 2;
        }
        long ans = 0;
        for (int i = 0; i < v.length; i++) {
            if (v[i] == e[i]) { // cycle
                long q = (v[i] + 1) / 2;
                ans += v[i] * q * (q - (v[i] % 2));
            } else { // chain
                ans += v[i] * (v[i] + 1) * (2 * v[i] + 1) / 6 - v[i]
                        * (v[i] + 1) / 2;
            }
        }
        out.println(ans);
    }
 
    private void dfs(int x, int k) {
        c[x] = k;
        for (int i : g[x]) {
            if (c[i] < 0) {
                dfs(i, k);
            }
        }
    }
 
}
shash вне форума Ответить с цитированием
Старый 14.05.2010, 00:07   #3
shash
 
Регистрация: 13.05.2010
Сообщений: 3
По умолчанию

какие идеи?
shash вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм Кнута-Морриса-Пратта или Рабина-Карпа (язык С++). Может у кого-нибудь есть готовый рабочий ? Беата Помощь студентам 7 27.03.2010 10:50
Нужно положить готовый дизайн на готовый сайт! Full87 Фриланс 1 16.12.2009 16:18
готовый код!нужна помошь в проверке(корректировке) -ushёl- Помощь студентам 23 13.03.2009 17:02
Программа "простые итерации". Готовый код. Проблема с компилированием. Oleg330 Общие вопросы C/C++ 9 25.12.2008 23:51
Объясните код Neymexa Общие вопросы по Java, Java SE, Kotlin 1 29.11.2008 02:33