i sözde kod anlayamıyorum, Donalds B. Johnson'un algoritmada yardımcı (BÖLÜM II)

oy
6

i grafikte döngüleri (devre) bulma Donald Johnson tarafından yayınlanan belirli bir kağıt parçası anlamak olamaz.

anlayamıyorum Daha spesifik sözde aşağıdaki kod satırında belirtilen matris Ak şudur:

Ak: indüklediği G alt grafiği en tepe noktasından güçlü bir bileşeni K = bitişiklik yapısı {s, s + 1, .... n};

Vk ne bildirmek olmadan do Vk for i in sonra bazı satırlar is mentins kötü şeyler yapmak için ...

Bildiğim kadarıyla I aşağıdaki anlama sahiptir: 1), genel olarak, güçlü bir komponent alt grafiğin bir düğüme bir yol (vardır, bu alt grafiğin her düğüm için olan bir grafik alt grafiktir başka bir deyişle, alt-grafik başka düğüm alt grafiğin bir düğüm erişebilir)

2) bir alt grafiği ile indüklenen bir düğüm listesi bütün bu düğümler artı bu düğümleri bağlayan bütün kenarları ihtiva eden bir grafiktir. {(u, y | u, W, Y ve (u, y), E) kağıt matematiksel tanımı W V ve F = W)} alt kümesi ise F W ile indüklenen G nin bir alt grafiğinin olduğu) u, y kenarlar olduğu, E grafikte, tüm kenarların grubu, W düğüm kümesidir.

3) kodu uygulanmasında düğümler n ... Tamsayılara 1 ile adlandırılır.

4) şüpheli Vk güçlü bileşen K. düğüm grubu olduğu

Şimdi soruya. bunun 3 güçlü bileşenleri SC1 = {1 ayrılabilir V = {1,2,3,4,5,6,7,8,9} bir grafik G = (V, E) sahip Sağlar ki, 4,7,8} SC2 = {2,3,9} SC3 = {5,6} (ve kenarları)

Herkes bana s = 1, s = 2, s = 5 neyi Vk ve Ak kodlarına göre olacak eğer bir örnek verebilir misiniz?

Sahte kod benim önceki soruya ise Donald B. Johnson'un algoritmada pseudocode anlama

ve kağıt bulunabilir Donald B. Johnson'un algoritmada pseudocode anlama

şimdiden teşekkür ederim

Oluştur 30/05/2010 saat 19:50
kaynak kullanıcı
Diğer dillerde...                            


4 cevaplar

oy
10

İşe yarıyor! Bir In önceki yineleme arasında Johnson algoritması , bunu sözde vardı Abir oldu komşuluk matrisi . Bunun yerine, temsil ettiği görülmektedir bitişiklik listesi . Bu örnekte, aşağıdaki tepe noktalarını uygulanan {a, b, c} sayılı {0, 1, 2}, aşağıdaki devreleri elde edilmiştir.

Zeyilname: Bu teklif belirtildiği gibi düzenleme ve yararlı cevap , algoritma belirtir unblock()sahip eleman kaldırmalısınız değeri w değil, eleman sahip indeksi w .

list.remove(Integer.valueOf(w));

Örnek çıktı:

0 1 0
0 1 2 0
0 2 0
0 2 1 0
1 0 1
1 0 2 1
1 2 0 1
1 2 1
2 0 1 2
2 0 2
2 1 0 2
2 1 2

Varsayılan olarak, program ile başlar s = 0; uygulayan s := least vertex in Vbir optimizasyon kaldığı sürece. Sadece tek döngüleri üreten bir varyasyon gösterilmektedir burada .

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Stack;

/**
 * @see http://dutta.csc.ncsu.edu/csc791_spring07/wrap/circuits_johnson.pdf
 * @see https://stackoverflow.com/questions/2908575
 * @see https://stackoverflow.com/questions/2939877
 * @see http://en.wikipedia.org/wiki/Adjacency_matrix
 * @see http://en.wikipedia.org/wiki/Adjacency_list
 */
public final class CircuitFinding {

    final Stack<Integer> stack = new Stack<Integer>();
    final List<List<Integer>> a;
    final List<List<Integer>> b;
    final boolean[] blocked;
    final int n;
    int s;

    public static void main(String[] args) {
        List<List<Integer>> a = new ArrayList<List<Integer>>();
        a.add(new ArrayList<Integer>(Arrays.asList(1, 2)));
        a.add(new ArrayList<Integer>(Arrays.asList(0, 2)));
        a.add(new ArrayList<Integer>(Arrays.asList(0, 1)));
        CircuitFinding cf = new CircuitFinding(a);
        cf.find();
    }

    /**
     * @param a adjacency structure of strong component K with
     * least vertex in subgraph of G induced by {s, s + 1, n};
     */
    public CircuitFinding(List<List<Integer>> a) {
        this.a = a;
        n = a.size();
        blocked = new boolean[n];
        b = new ArrayList<List<Integer>>();
        for (int i = 0; i < n; i++) {
            b.add(new ArrayList<Integer>());
        }
    }

    private void unblock(int u) {
        blocked[u] = false;
        List<Integer> list = b.get(u);
        for (int w : list) {
            //delete w from B(u);
            list.remove(Integer.valueOf(w));
            if (blocked[w]) {
                unblock(w);
            }
        }
    }

    private boolean circuit(int v) {
        boolean f = false;
        stack.push(v);
        blocked[v] = true;
        L1:
        for (int w : a.get(v)) {
            if (w == s) {
                //output circuit composed of stack followed by s;
                for (int i : stack) {
                    System.out.print(i + " ");
                }
                System.out.println(s);
                f = true;
            } else if (!blocked[w]) {
                if (circuit(w)) {
                    f = true;
                }
            }
        }
        L2:
        if (f) {
            unblock(v);
        } else {
            for (int w : a.get(v)) {
                //if (v∉B(w)) put v on B(w);
                if (!b.get(w).contains(v)) {
                    b.get(w).add(v);
                }
            }
        }
        v = stack.pop();
        return f;
    }

    public void find() {
        while (s < n) {
            if (a != null) {
                //s := least vertex in V;
                L3:
                circuit(s);
                s++;
            } else {
                s = n;
            }
        }
    }
}
Cevap 01/06/2010 saat 18:30
kaynak kullanıcı

oy
1

Bir sumbitted vardı düzenleme atılmış istisna düzeltmek için @ trashgod koduna isteği unblock(). Esas olarak, algoritma elemanı belirtir w(ki olmayan bir indeks) listeden kaldırılır etmektir. Kullanılan, yukarıda kod list.remove(w)davranır, wbir indeks olarak.

Benim düzenleme isteği reddedildi! Ben 20,000 düğümler ve 70.000 kenarları bir ağ üzerinde benim modifikasyonu ile yukarıda test edilmiş ve çünkü o çökmez neden emin değilim.

Ayrıca Johnson algoritması daha yönsüz grafiklere uyarlanması değiştirdiniz. Herkes bu değişiklikleri istiyorsa benimle irtibata geçin.

Aşağıda benim kodudur unblock().

private void unblock(int u) {
    blocked[u] = false;
    List<Integer> list = b.get(u);
    int w;
    for (int iw=0; iw < list.size(); iw++) {
        w = Integer.valueOf(list.get(iw));
        //delete w from B(u);
        list.remove(iw);
        if (blocked[w]) {
            unblock(w);
        }
    }
}
Cevap 12/02/2013 saat 04:05
kaynak kullanıcı

oy
1

@trashgod, örnek çıkış siklik permütasyon olan döngüsü içerir. Örneğin 0-1-0 ve 1-0-1 Aslında çıkış gereken içeren aynı sadece 5 döngü, yani 0 1 0, 0 2 0, 0 1 2 0, 0 2 1, 0, 1 2 1,

Biri diğerinin döngüsel permütasyon değilse 'İki temel devreler farklıdır: Johnson kağıt bir döngü ne olduğunu açıklar. 'Bir de volfram sayfasına bakabilirsiniz: Bu aynı zamanda çıkış 5 döngüsünü aynı girişi için.

http://demonstrations.wolfram.com/EnumeratingCyclesOfADirectedGraph/

Cevap 08/04/2015 saat 12:14
kaynak kullanıcı

oy
1

Aşağıdaki varyasyon benzersiz döngüleri üretir. Buna göre , örneğin , bir uyarlanmıştır cevap temin @ user1406062 .

Kod:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Stack;

/**
 * @see https://en.wikipedia.org/wiki/Johnson%27s_algorithm
 * @see https://stackoverflow.com/questions/2908575
 * @see https://stackoverflow.com/questions/2939877
 * @see http://en.wikipedia.org/wiki/Adjacency_matrix
 * @see http://en.wikipedia.org/wiki/Adjacency_list
 */
public final class CircuitFinding {

    final Stack<Integer> stack = new Stack<Integer>();
    final Map<Integer, List<Integer>> a;
    final List<List<Integer>> b;
    final boolean[] blocked;
    final int n;
    Integer s;

    public static void main(String[] args) {
        List<List<Integer>> a = new ArrayList<List<Integer>>();
        a.add(new ArrayList<Integer>(Arrays.asList(1, 2)));
        a.add(new ArrayList<Integer>(Arrays.asList(0, 2)));
        a.add(new ArrayList<Integer>(Arrays.asList(0, 1)));
        CircuitFinding cf = new CircuitFinding(a);
        cf.find();
    }

    /**
     * @param a adjacency structure of strong component K with least vertex in
     * subgraph of G induced by {s, s + 1, n};
     */
    public CircuitFinding(List<List<Integer>> A) {
        this.a = new HashMap<Integer, List<Integer>>(A.size());
        for (int i = 0; i < A.size(); i++) {
            this.a.put(i, new ArrayList<Integer>());
            for (int j : A.get(i)) {
                this.a.get(i).add(j);
            }
        }
        n = a.size();
        blocked = new boolean[n];
        b = new ArrayList<List<Integer>>();
        for (int i = 0; i < n; i++) {
            b.add(new ArrayList<Integer>());
        }
    }

    private void unblock(int u) {
        blocked[u] = false;
        List<Integer> list = b.get(u);
        for (int w : list) {
            //delete w from B(u);
            list.remove(Integer.valueOf(w));
            if (blocked[w]) {
                unblock(w);
            }
        }
    }

    private boolean circuit(int v) {
        boolean f = false;
        stack.push(v);
        blocked[v] = true;
        L1:
        for (int w : a.get(v)) {
            if (w == s) {
                //output circuit composed of stack followed by s;
                for (int i : stack) {
                    System.out.print(i + " ");
                }
                System.out.println(s);
                f = true;
            } else if (!blocked[w]) {
                if (circuit(w)) {
                    f = true;
                }
            }
        }
        L2:
        if (f) {
            unblock(v);
        } else {
            for (int w : a.get(v)) {
                //if (v∉B(w)) put v on B(w);
                if (!b.get(w).contains(v)) {
                    b.get(w).add(v);
                }
            }
        }
        v = stack.pop();
        return f;
    }

    public void find() {
        s = 0;
        while (s < n) {
            if (!a.isEmpty()) {
                //s := least vertex in V;
                L3:
                for (int i : a.keySet()) {
                    b.get(i).clear();
                    blocked[i] = false;
                }
                circuit(s);
                a.remove(s);
                for (Integer j : a.keySet()) {
                    if (a.get(j).contains(s)) {
                        a.get(j).remove(s);
                    }
                }
                s++;
            } else {
                s = n;
            }
        }
    }
}

Çıktı:

0 1 0
0 1 2 0
0 2 0
0 2 1 0
1 2 1

referans için tüm döngüler:

0 1 0
0 1 2 0
0 2 0
0 2 1 0
1 0 1
1 0 2 1
1 2 0 1
1 2 1
2 0 1 2
2 0 2
2 1 0 2
2 1 2
Cevap 10/03/2016 saat 17:09
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more