Szukanie środka grafu w grafie ważonym

0

Mam problem - potrzebuję znaleźć środek grafu ważonego, który dany jest definicją:

centr.jpg

czyli dla tego rysunku wierzchołki b,c,e są tymi środkami. Napisałem programik dla danych na razie z obrazka, ale mój program znajduje mi tylko jedno centrum - wierzchołek "b", czyli 2 :( i nie znajduje ich więcej. Ma ktoś pomysł, gdzie jest błąd?

To mój kod:

#include <iostream>
#include <vector>
using namespace std;

int** tab2Wym(int N)
{
    int **tab = new int*[N];
    for(int i=0; i<N; i++)
        tab[i] = new int[N];

    return tab;
}

void wypelnij(int N, int **tab2Wym)
{
    for(int i=0; i<N; i++)
        for(int j=0; j< N; j++)
            if(i == j)
                tab2Wym[i][j] = 0;
            else
                tab2Wym[i][j] = 1000000000;
}

vector<int> centr(int N, int **tab2Wym)
{
    int *dist = new int[N];
    for(int i=0; i<N; i++)
    {
        dist[i] = 0;
        for(int j=0; j<N; j++)
        {
            if(i != j && tab2Wym[i][j] > dist[i])
                dist[i] = tab2Wym[i][j];
        }
    }
    vector<int> centr;
    int c = 0;
    for(int i=0; i<N; i++)
    {
        if (dist[i] < dist[c]){
            c = i;
            centr.push_back(i+1);
        }
    }

    return centr;
}

void floyd(int N, int **g){ //znajduje najkrotsze sciezki miedzy kazda para wierzcholkow w grafie
    for(int k=0; k<N; k++){
        for(int i=0; i<N; i++){
            for(int j=0; j<N; j++){
                if(g[i][j]>g[i][k]+g[k][j]){ //jezeli droga z i do j, poprzez wierzcholek posredni k jest krotsza niz aktualnie najkrotsza znana trasa i->j to zaktualizuj
                    g[i][j]=g[i][k]+g[k][j];
                }
            }
        }
    }
}

int main(int argc, char **argv)
{
    int N = 5;
    int M = 8;
    int **g = tab2Wym(N);
    wypelnij(N, g);

    g[0][1] = 4;
    g[1][0] = 4;
    g[1][2] = 10;
    g[2][1] = 10;
    g[2][3] = 2;
    g[3][2] = 2;
    g[3][4] = 4;
    g[4][3] = 4;
    g[4][0] = 7;
    g[0][4] = 7;
    g[1][4] = 10;
    g[4][1] = 10;
    g[1][3] = 5;
    g[3][1] = 5;
    g[2][4] = 1;
    g[4][2] = 1;

    floyd(N, g);
    vector<int> c = centr(N, g);
    for(int i=0; i<c.size(); i++)
        cout << c[i] << " ";

    return 0;
}
0

A gdzie sprawdzanie, że jest równe?
Na dodatek, masz źle to zrobione, bo dodajesz wartości za każdym razem gdy znajdziesz coś mniejszego.
Powinno być: jeśli znajdziesz równe dodaj do tablicy środek, jeśli znajdziesz coś mniejszego wyczyść i tablicę i dodaj środek.

0

Dzięki za odpowiedź;) Coś takiego:

vector<int> centr(int N, int **tab2Wym)
{
    int *dist = new int[N];
    for(int i=0; i<N; i++)
    {
        dist[i] = 0;
        for(int j=0; j<N; j++)
        {
            if(i != j && tab2Wym[i][j] > dist[i])
                dist[i] = tab2Wym[i][j];
        }
    }
    vector<int> centr;
    int c = 0;
    for(int i=0; i<N; i++)
    {
        if (dist[i] == dist[c]){
            c = i;
            centr.push_back(i+1);
        }

        if (dist[i] < dist[c]){
            c = i;
            centr.clear();
            centr.push_back(i+1);
        }
    }

    return centr;
}

?

0

jak dla mnie to te "i+1" to WTF!

0
vector<int> centr(int N, int **tab2Wym)
{
    vector<int> centr;

    int minimum = INT_MAX;
    for(int i=0; i<N; i++) {
        int maxDist = INT_MIN;
        for(int j=0; j<N; j++)
        {
            if(i != j && tab2Wym[i][j] > maxDist)
                maxDist = tab2Wym[i][j];
        }

        if (minimum>maxDist) {
             centr.clear();
             centr.push_back(i);
        } else if (minimum==maxDist) {
             centr.push_back(i);
        }
    }
 
    return centr;
}
0

poprawka

vector<int> centr(int N, int **tab2Wym)
{
    vector<int> centr;
 
    int minimum = INT_MAX;
    for(int i=0; i<N; i++) {
        int maxDist = INT_MIN;
        for(int j=0; j<N; j++)
        {
            if(i != j && tab2Wym[i][j] > maxDist)
                maxDist = tab2Wym[i][j];
        }
 
        if (minimum>maxDist) {
             minimum=maxDist; // tego brakowało
             centr.clear();
             centr.push_back(i);
        } else if (minimum==maxDist) {
             centr.push_back(i);
        }
    }
 
    return centr;
}
0

Zmieniłem na Twoją ostatnią poprawkę, ale teraz jakieś dziwne rzeczy mi wypisuje, całkiem złe. Jak poprawiłem na to, co pierwsze mi zasugerowałeś, jest ok.

Jak w końcu powinno być?

1 użytkowników online, w tym zalogowanych: 0, gości: 1