Mam problem - potrzebuję znaleźć środek grafu ważonego, który dany jest definicją:
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;
}