Jump to content
cblocks

Grafos: Transporte de pacientes

Recommended Posts

cblocks

Boa noite,

Estou com algumas dificuldades num projecto de c++ que é sobre grafos. O enunciado é o seguinte:

Uma clínica de saúde tem várias sucursais espalhadas numa cidade, e oferece um servido de transportes para os seus pacientes. Cada sucursal possui um veículo de transportes, com uma capacidade limitada de ocupantes, para além do motorista. A Clínica pretende implementar um sistema eficiente de transporte de doentes a fim de transportar o maior número de pessoas que residem mais próximo de uma sucursal com o mesmo veículo. Quando o número de passageiros excede a sua capacidade de transportes, o sistema deve ser reorganizado para se encontrar um balanceamento adequado entre os vários centros de saúde da clínica. A aplicação deverá permitir:

   

    - definir sobre uma rede viária a localização de cada centro de saúde da clínica. Novos centros poderão ser incluídos, estando automaticamente disponível um veículo para transportes de pacientes;

   

    - gerir pacientes (registar novos pacientes, excluir pacientes antigos, alterar seus dados de morada);

   

    - gerir frota de veículos, definindo a sua capacidade de transporte.

Não estou a conseguir fazer a visualização do grafo. Já tenho a opção no menu para isso e tudo. Só falta mesmo implementar, a partir deste código da API para visualização de grafos:

 
//graphviewer.h

#ifndef _GRAPH_VIEWER_H_
#define _GRAPH_VIEWER_H_

#ifdef linux
#include <unistd.h>
#else
#include <winsock2.h>
#include <Windows.h>
#endif

#include <stdlib.h>
#include <signal.h>
#include <string>

#include "edgetype.h"
#include "connection.h"

class GraphViewer {
public:
  GraphViewer(int, int, bool);
  bool createWindow(int width, int height);
  bool addNode(int id, int x, int y);
  bool addNode(int id); 
  bool addEdge(int id, int v1, int v2, int edgeType);

  bool removeNode(int id); 
  bool removeEdge(int id); 

  bool setVertexLabel(int id, string label);

  bool setEdgeLabel(int id, string label);
  bool setEdgeColor(int id, string color);

  bool setVertexColor(int id, string color);

  bool defineEdgeColor(string color);
  bool defineVertexColor(string color);
  
  bool setBackground(string path);

  bool rearrange();

#ifdef linux
  static pid_t procId;
#endif

private:
  int width, height;
  bool isDynamic;

  Connection *con;
};

#endif


//graphviewer.cpp

#include "graphviewer.h"

#ifdef linux
pid_t GraphViewer::procId = NULL;
#endif

GraphViewer::GraphViewer(int width, int height, bool dynamic) {
  this->width = width;
  this->height = height;
  this->isDynamic = dynamic;

#ifdef linux
  if (!(procId = fork())) {
    system("java -jar GraphViewerController.jar");
    kill(getppid(), SIGINT);
    exit(0);
  }
  else {    
    usleep(2000000);
    con = new Connection();

    char buff[200];
    sprintf(buff, "newGraph %d %d %s\n", width, height, (dynamic?"true":"false"));
    string str(buff);
    con->sendMsg(str);
  }
#else
  STARTUPINFO si;
  PROCESS_INFORMATION pi;
  ZeroMemory( &si, sizeof(si) );
  si.cb = sizeof(si);
  ZeroMemory( π, sizeof(pi) );

  if( !CreateProcess( NULL,   // No module name (use command line)
	      "java -jar GraphViewerController.jar",        // Command line
	      NULL,           // Process handle not inheritable
	      NULL,           // Thread handle not inheritable
	      FALSE,          // Set handle inheritance to FALSE
	      0,              // No creation flags
	      NULL,           // Use parent's environment block
	      NULL,           // Use parent's starting directory 
	      &si,            // Pointer to STARTUPINFO structure
	      π )           // Pointer to PROCESS_INFORMATION structure
      ) {
    printf( "CreateProcess failed (%d).\n", GetLastError() );
    return;
  }

  // Close process and thread handles. 
  CloseHandle( pi.hProcess );
  CloseHandle( pi.hThread );

  Sleep(2000);
  con = new Connection();
  
  char buff[200];
  sprintf(buff, "newGraph %d %d %s\n", width, height, (dynamic?"true":"false"));
  string str(buff);
  con->sendMsg(str);
#endif

}

bool GraphViewer::createWindow(int width, int height) {
  char buff[200];
  sprintf(buff, "createWindow %d %d\n", width, height);
  string str(buff);
  return con->sendMsg(str);
}

bool GraphViewer::addNode(int id) {
  char buff[200];
  sprintf(buff, "addNode1 %d\n", id);
  string str(buff);
  return con->sendMsg(str);
}

bool GraphViewer::addNode(int id, int x, int y) {
  char buff[200];
  sprintf(buff, "addNode3 %d %d %d\n", id, x, y);
  string str(buff);
  return con->sendMsg(str);
}

bool GraphViewer::addEdge(int id, int v1, int v2, int edgeType) {
  char buff[200];
  sprintf(buff, "addEdge %d %d %d %d\n", id, v1, v2, edgeType);
  string str(buff);
  return con->sendMsg(str);
}

bool GraphViewer::setEdgeLabel(int k, string label) {
  char buff[200];
  sprintf(buff, "setEdgeLabel %d %s\n", k, label.c_str());
  string str(buff);
  return con->sendMsg(str);
}

bool GraphViewer::setVertexLabel(int k, string label) {
  char buff[200];
  sprintf(buff, "setVertexLabel %d %s\n", k, label.c_str());
  string str(buff);
  return con->sendMsg(str);
}

bool GraphViewer::defineEdgeColor(string color) {
  char buff[200];
  sprintf(buff, "defineEdgeColor %s\n", color.c_str());
  string str(buff);
  return con->sendMsg(str);
}

bool GraphViewer::removeNode(int id) {
  char buff[200];
  sprintf(buff, "removeNode %d\n", id);
  string str(buff);
  return con->sendMsg(str);
}

bool GraphViewer::removeEdge(int id) {
  char buff[200];
  sprintf(buff, "removeEdge %d\n", id);
  string str(buff);
  return con->sendMsg(str);
}

bool GraphViewer::setEdgeColor(int k, string color) {
  char buff[200];
  sprintf(buff, "setEdgeColor %d %s\n", k, color.c_str());
  string str(buff);
  return con->sendMsg(str);
}

bool GraphViewer::defineVertexColor(string color) {
  char buff[200];
  sprintf(buff, "defineVertexColor %s\n", color.c_str());
  string str(buff);
  return con->sendMsg(str);
}

bool GraphViewer::setVertexColor(int k, string color) {
  char buff[200];
  sprintf(buff, "setVertexColor %d %s\n", k, color.c_str());
  string str(buff);
  return con->sendMsg(str);
}

bool GraphViewer::setBackground(string path) {
  char buff[200];
  sprintf(buff, "setBackground %s\n", path.c_str());
  string str(buff);
  return con->sendMsg(str);
}

bool GraphViewer::rearrange() {
  return con->sendMsg("rearrange\n");
}



//edgetype.h

#ifndef _EDGETYPE_
#define _EDGETYPE_

class EdgeType {
public: 
  const static int UNDIRECTED = 0;
  const static int DIRECTED = 1;
};

#endif


//connection.h

#ifndef _CONNECTION_
#define _CONNECTION_

#include <cstdio>
#include <cstdlib>
#include <cstring>

#ifdef linux
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#else
#include <winsock2.h>
#endif

#include <string>
#include <iostream>

using namespace std;

class Connection {
public:
  Connection();

  bool sendMsg(string msg);
  string readLine();
private: 
#ifdef linux
  int sock;
#else
  SOCKET sock;
#endif
};

#endif


//connection.cpp

#include "connection.h"

void myerror(string msg) {
  printf("%s\n", msg.c_str());
  exit(-1);
}

Connection::Connection() {
#ifdef linux
  struct sockaddr_in echoServAddr; /* Echo server address */
  struct  hostent  *ptrh;
  
  /* Create a reliable, stream socket using TCP */
  if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    myerror("socket() failed");
  
  /* Construct the server address structure */
  memset(&echoServAddr, 0, sizeof(echoServAddr));     /* Zero out structure */
  echoServAddr.sin_family      = AF_INET;             /* Internet address family */
  echoServAddr.sin_port = htons(7772);                /* Server port */

  ptrh = gethostbyname("localhost");

  memcpy(&echoServAddr.sin_addr, ptrh->h_addr, ptrh->h_length);
  
  /* Establish the connection to the echo server */
  if (connect(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0)
    myerror("connect() failed");
#else
	WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
    if (iResult != NO_ERROR)
			printf("Client: Error at WSAStartup().\n");

// Create a socket.
    sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sock == INVALID_SOCKET) {
        printf("Client: socket() - Error at socket(): %ld\n", WSAGetLastError());
        WSACleanup();
    }

    // Connect to a server.
    sockaddr_in clientService;
    clientService.sin_family = AF_INET;
    // Just test using the localhost, you can try other IP address
    clientService.sin_addr.s_addr = inet_addr("127.0.0.1");
    clientService.sin_port = htons(7772);

    if (connect(sock, (SOCKADDR*)&clientService, sizeof(clientService)) == SOCKET_ERROR) {
        printf("Client: connect() - Failed to connect.\n");
        WSACleanup();
    }
#endif
}

bool Connection::sendMsg(string msg) {
  int res = send(sock, msg.c_str(), msg.size(), 0);
  if (res < 0) 
    myerror("Unable to send");
  string answer = readLine();
  return answer == "ok";
}

string Connection::readLine() {
  string msg;  
  char ch;
  while (true) {
    recv(sock, &ch, 1, 0);
    if (ch == '\n')
      break;
    msg.push_back(ch);
  }
  return msg;
}


Assumindo que se tem já um grafo completo criado (Cidade, Ruas e Nós). A partir daí é suposto fazer os insert node, insert edge, etc... O que não estou a conseguir fazer, e pedia que alguém me ajudasse.

Está a funcionar o carregamento dos dados para a estrutura de dados do programa. O próximo passo é usar a API para os desenhar no ecrã que é o que não estou a conseguir fazer.

Envio em baixo o que fiz até agora.

//Rua.h

#ifndef RUA_H_
#define RUA_H_

#include "No.h"
#include <string>

using namespace std;

class Rua
{
private:
long int idRua;
string nome;
No origem;
No destino;
bool umSentido;
public:
Rua();
Rua(long int id, string n, bool sent);
Rua(long int id, No o, No d, string n, bool sent);
    string getNome() const;
    long int getIdRua() const;
    void setNome(string nome);
    void setNumero(double numero);
    bool getUmSentido() const;
    void setUmSentido(bool umSentido);
};

#endif

//Rua.cpp

#include <string>
#include "Rua.h"

Rua::Rua(){};

Rua::Rua(long int id, string n, bool sent): idRua(id), nome(n), umSentido(sent){}

Rua::Rua(long int id, No o, No d, string n, bool sent): idRua(id), origem(o), destino(d), nome(n), umSentido(sent) {};

string Rua::getNome() const
{
    return nome;
}

long int Rua::getIdRua() const
{
    return idRua;
}

void Rua::setNome(string nome)
{
    this->nome = nome;
}

bool Rua::getUmSentido() const
{
    return umSentido;
}

void Rua::setUmSentido(bool umSentido)
{
    this->umSentido = umSentido;
}

void Rua::setNumero(double id)
{
    this->idRua = idRua;
}


//No.h

#ifndef NO_H_
#define NO_H_

using namespace std;

class No
{
private:
long int idNo;
double latitude;
double longitude;
public:
No();
No(long int id, double lat, double longi);
    long int getIdNo() const;
    double getLatitude() const;
    double getLongitude() const;
    void setIdNo(double idNo);
    void setLatitude(double latitude);
    void setLongitude(double longitude);
};

#endif



//No.cpp


#include "No.h"

No::No(){}

No::No(long int id, double lat, double longi): idNo(id), latitude(lat), longitude(longi){}

long int No::getIdNo() const
{
    return idNo;
}

double No::getLatitude() const
{
    return latitude;
}

double No::getLongitude() const
{
    return longitude;
}

void No::setIdNo(double idNo)
{
    this->idNo = idNo;
}

void No::setLatitude(double latitude)
{
    this->latitude = latitude;
}

void No::setLongitude(double longitude)
{
    this->longitude = longitude;
}





//Menu.h

#ifndef MENU_H_
#define MENU_H_

#include "Cidade.h"
#include "Rua.h"
#include "No.h"
#include <iostream>
#include <cstdio>
#include <stdlib.h>
#include <fstream>
#include <sstream>
#include <vector>
#include <algorithm>

using namespace std;

class Menu: public Cidade
{
public:
Menu();
void menuPrincipal();
void carregarMapa();
void testes();
};

#endif


//Menu.cpp


#include "Menu.h"

Menu::Menu(){}

void Menu::menuPrincipal() {
char opcao;
system("cls");
cout << "+-----------------------------+\n"
		<< "|      Clinicas de Saude      |\n"
		<< "+-----------------------------+\n"
		<< "+-----------------------------+\n"
		<< "| 1. Gestao de Clinicas       |\n"
		<< "| 2. Gestao de Clientes       |\n"
		<< "| 3. Gestao de Transportes    |\n"
		<< "| 4. Ver Mapa                 |\n"
		<< "| 5. Carregar Mapa da Cidade  |\n"
		<< "| 6. Testes (Versao BETA)     |\n"
		<< "+-----------------------------+\n\n" << "Opcao: ";

cin >> opcao;

switch (opcao) {
case '1':
	//TODO: gestaoClinicas();
	break;
case '2':
	//TODO: gestaoClientes();
	break;
case '3':
	//TODO: gestaoTransportes();
case '4':
	//TODO: verMapa();
	break;
case '5':
	carregarMapa();
	menuPrincipal();
	break;
case '6':
	testes();
	menuPrincipal();
default:
	cout << "A opcao inserida nao e valida!\n\n"
			<< "Pessione 'ENTER' para continuar\n\n";
	getchar();
	getchar();
	menuPrincipal();
}

}


void Menu::carregarMapa() {
//Nomes de ficheiros
string ficheiroRuas, ficheiroSubRuas, ficheiroNos;
//strings usadas para ler as Ruas
string linhaRua, stringIdRua, nomeRua, stringUmSentido;
//strings usadas para ler os Nós
string linhaNo, stringIdNo, stringLatitude, stringLongitude;
//strings usadas para ler as Sub-Ruas
string linhaSubRua, stringNoOrigem, stringNoDestino;
//string auxiliar
string dummy;

double latitude, longitude;
long int idNo, idRua, idNoOrigem, idNoDestino;
bool umSentido;
No no, noOrigem, noDestino;
vector<Rua> vecAuxRuas;

cout << "Nome da cidade a carregar: ";
cin.ignore(256, '\n');
getline(cin, nome);
cout << "\n";
cout << "Nome do ficheiro com os NOS: ";
cin >> ficheiroNos;
ficheiroNos += ".txt";

ifstream fileNos(ficheiroNos.c_str());
if (fileNos.is_open()) {
	while (getline(fileNos, linhaNo)) {
		stringstream stream(linhaNo);
		getline(stream, stringIdNo, ';');
		getline(stream, dummy, ';');
		getline(stream, dummy, ';');
		getline(stream, stringLatitude, ';');
		getline(stream, stringLongitude, ';');
		//Conversão da string stringIdNo para um long int
		idNo = atol(stringIdNo.c_str());
		//Conversao da stringLatitude para um double
		latitude = atof(stringLatitude.c_str());
		//conversão da stringLongitude para um double
		longitude = atof(stringLongitude.c_str());

		no = No(idNo, latitude, longitude);

		nos.push_back(no);
	}
}
cout << "\n";

cout << "Nome do ficheiro com as RUAS: ";
cin >> ficheiroRuas;
ficheiroRuas += ".txt";

ifstream fileRuas(ficheiroRuas.c_str());
if (fileRuas.is_open()) {
	while (getline(fileRuas, linhaRua)) {
		stringstream stream(linhaRua);
		getline(stream, stringIdRua, ';');
		getline(stream, nomeRua, ';');
		getline(stream, stringUmSentido);
		//Conversão da string stringIdRua para um long int
		idRua = atol(stringIdRua.c_str());
		//Conversao da stringUmSentido para um booleano
		if (stringUmSentido == "False")
			umSentido = false;
		else
			umSentido = true;

		Rua auxRua = Rua(idRua, nomeRua, umSentido);
		vecAuxRuas.push_back(auxRua);
	}
}

cout << "Nome do ficheiro com as SUB-RUAS: ";
cin >> ficheiroSubRuas;
ficheiroSubRuas += ".txt";

ifstream subRuas(ficheiroSubRuas.c_str());
if (subRuas.is_open()) {
	while (getline(subRuas, linhaSubRua)) {
		stringstream stream(linhaSubRua);
		getline(stream, stringIdRua, ';');
		getline(stream, stringNoOrigem, ';');
		getline(stream, stringNoDestino);
		//Conversão da string stringIdRua para um long int
		idRua = atol(stringIdRua.c_str());
		//Conversão da string stringNoOrigem para um long int
		idNoOrigem = atol(stringNoOrigem.c_str());
		//Conversão da string stringNoDestino para um long int
		idNoDestino = atol(stringNoDestino.c_str());

		for (unsigned int j = 0; j < nos.size(); j++) {
			if (idNoOrigem == nos[j].getIdNo()) {
				noOrigem = nos[j];
			} else if (idNoDestino == nos[j].getIdNo()) {
				noDestino = nos[j];
			}
		}

		for(unsigned int i = 0; i < vecAuxRuas.size(); i++){
			if(idRua == vecAuxRuas[i].getIdRua()){
				Rua rua = Rua(idRua, noOrigem, noDestino, vecAuxRuas[i].getNome(), vecAuxRuas[i].getUmSentido());
				cout << "\n" << rua.getNome() << "\n";
				ruas.push_back(rua);
			}
		}

	}
}
}

void Menu::testes(){
/*int i;
cout << "\nCidade: " << nome << endl << endl;
cout << "Indice do No: ";
cin >> i;
cout << nos[i].getIdNo() << "\n";
cout << "Indice da rua: ";
cin >> i;
cout << ruas[i].getIdRua() << "\n";
system("pause");*/
}

//Clinica.h

#ifndef CLINICA_H_
#define CLINICA_H_

#include "Cliente.h"
#include <string>
#include <vector>

using namespace std;

class Clinica{
private:
string morada;
vector<Cliente> clientes;

//Quantos veículos pode ter uma clinica? Só pode ter um?

public:
};

#endif


//Clinica.cpp

#include "Clinica.h"

//Cliente.h

#ifndef CLIENTE_H
#define CLIENTE_H_

#include <string>

using namespace std;

class Cliente{
private:
long int BI;
string nome;
int idade;
string morada;
public:
Cliente();
Cliente(long int bi, string n, int i, string mor);
    long int getBI() const;
    int getIdade() const;
    string getMorada() const;
    string getNome() const;
    void setBI(long int BI);
    void setIdade(int idade);
    void setMorada(string morada);
    void setNome(string nome);

};

#endif

//Cliente.cpp


#include "Cliente.h"


Cliente::Cliente(){}

Cliente::Cliente(long int bi, string n, int i, string mor): BI(bi), nome(n), idade(i), morada(mor){}

long int Cliente::getBI() const
{
    return BI;
}

int Cliente::getIdade() const
{
    return idade;
}

string Cliente::getMorada() const
{
    return morada;
}

string Cliente::getNome() const
{
    return nome;
}

void Cliente::setBI(long int BI)
{
    this->BI = BI;
}

void Cliente::setIdade(int idade)
{
    this->idade = idade;
}

void Cliente::setMorada(string morada)
{
    this->morada = morada;
}

void Cliente::setNome(string nome)
{
    this->nome = nome;
}


//Cidade.h

#ifndef CIDADE_H_
#define CIDADE_H_

#include "No.h"
#include "Rua.h"
#include <vector>
#include <string>

using namespace std;

class Cidade
{
public:
string nome;
vector<No> nos;
vector<Rua> ruas;
Cidade();
Cidade(string nom, vector<No> n, vector<Rua> r);
    string getNome() const;
    vector<No> getNos() const;
    vector<Rua> getRuas() const;
    void setNome(string nome);
    void setNos(vector<No> nos);
    void setRuas(vector<Rua> ruas);
};


class OpcaoInvalida{
private:
       /**
        * Opcao invalida
        */
       char opcao;
public:
       /**
        * Construtor que recebe a opcao tomada pelo utilizador
        */
       OpcaoInvalida(char _opcao){opcao = _opcao;};
       /**
        * Devolve opcao
        */
       char get_opcao(){return opcao;}
};

#endif


//Cidade.cpp

#include "Cidade.h"

Cidade::Cidade(){}

Cidade::Cidade(string nom, vector<No> n, vector<Rua> r): nome(nom), nos(n), ruas(r){}

string Cidade::getNome() const
{
    return nome;
}

vector<No> Cidade::getNos() const
{
    return nos;
}

vector<Rua> Cidade::getRuas() const
{
    return ruas;
}

void Cidade::setNome(string nome)
{
    this->nome = nome;
}

void Cidade::setNos(vector<No> nos)
{
    this->nos = nos;
}

void Cidade::setRuas(vector<Rua> ruas)
{
    this->ruas = ruas;
}


//main.cpp

#include "Menu.h"

using namespace std;

int main()
{
Menu menu;
menu.menuPrincipal();
return 0;
}


Share this post


Link to post
Share on other sites
thoga31

Olhei para o tópico just to see e fiquei de olhos em bico com tanto código. :)

Passo aqui somente para te dar uma dica. Utiliza correctamente a tag code, indicando a linguagem. Ou seja: code=linguagem (não coloco parêntesis rectos se não inicia a tag e eu não quero :P ). No teu caso, colocarás "cpp" no lugar de "linguagem".

Quando escreves a mensagem, tens uma ComboBox a deizer "Inserir Código": seleccionas lá a linguagem e ele faz isto por ti. :)

//main.cpp

#include "Menu.h"

using namespace std;

int main()
{
        Menu menu;
        menu.menuPrincipal();
        return 0;
}

Mais bonito, heim? ;)

Cumpz.


Knowledge is free!

Share this post


Link to post
Share on other sites
Localhost

Que tipo de estrutura estás a utilizar para guardar o grafo?


here since 2009

Share this post


Link to post
Share on other sites
cblocks

Olhei para o tópico just to see e fiquei de olhos em bico com tanto código. :P

Passo aqui somente para te dar uma dica. Utiliza correctamente a tag code, indicando a linguagem. Ou seja: code=linguagem (não coloco parêntesis rectos se não inicia a tag e eu não quero :) ). No teu caso, colocarás "cpp" no lugar de "linguagem".

Quando escreves a mensagem, tens uma ComboBox a deizer "Inserir Código": seleccionas lá a linguagem e ele faz isto por ti. :)

//main.cpp

#include "Menu.h"

using namespace std;

int main()
{
        Menu menu;
        menu.menuPrincipal();
        return 0;
}

Mais bonito, heim? ;)

Cumpz.

Ola,

Obrigada pelas dicas, agora já sei como ei de fazer para a próxima :)

Share this post


Link to post
Share on other sites
cblocks

Ola,

Obrigada pelas dicas, agora já sei como ei de fazer para a próxima ;)

Ola,

Na classe cidade estou a usar um vector para nós e outro vector para as ruas, que são criadas no carregamento dos ficheiros de nos, ruas e subruas.

Cumprimentos

Share this post


Link to post
Share on other sites
Localhost

E qual é que é a tua dúvida exactamente..?


here since 2009

Share this post


Link to post
Share on other sites
cblocks

E qual é que é a tua dúvida exactamente..?

Queria que alguem me ajudasse a fazer os insert node, insert edge, etc... e usar a API para desenhar os grafos no ecrã .

Cumprimentos

Share this post


Link to post
Share on other sites
Localhost

Posso-te ajudar na primeira parte da dúvida.

Estás com dúvidas de como criar o grafo, ou seja, representá-lo em memória? Existem várias maneiras. Matriz de adjacência, lista de adjacência, etc.

Queres ajuda para implementar isto?


here since 2009

Share this post


Link to post
Share on other sites
cblocks

Posso-te ajudar na primeira parte da dúvida.

Estás com dúvidas de como criar o grafo, ou seja, representá-lo em memória? Existem várias maneiras. Matriz de adjacência, lista de adjacência, etc.

Queres ajuda para implementar isto?

O que eu queria mesmo era a partir daquele codigo que pus no inicio representar a visualização do grafo.

Share this post


Link to post
Share on other sites
JD557

Isso parece-me ser uma adaptação do problema de fluxo mínimo.

Em vez de estares a guardar as ruas e os nós em vectores guarda isso directamente num grafo. Depois cria para o teu grafo uma função que te gere o GraphViewer (é só criar a janela e colocar os nós e as arestas conforme o teu grafo com as labels indicadas). Isto resolve-te a primeira alinea.

Gerir pacientes não estou a ver em que é que vai alterar o grafo, talvez altere o fluxo ou o custo das ruas, não sei... tenho de pensar melhor sobre o problema.

Gerir a frota de veiculos e mais uma questão de fluxo minimo, penso eu.


MIEIC @ FEUP

http://project557.blogspot.com/ --- Development Blog

Proteja a sua pen: http://lastknight.pt.vu

Share this post


Link to post
Share on other sites
cblocks

Isso parece-me ser uma adaptação do problema de fluxo mínimo.

Em vez de estares a guardar as ruas e os nós em vectores guarda isso directamente num grafo. Depois cria para o teu grafo uma função que te gere o GraphViewer (é só criar a janela e colocar os nós e as arestas conforme o teu grafo com as labels indicadas). Isto resolve-te a primeira alinea.

Gerir pacientes não estou a ver em que é que vai alterar o grafo, talvez altere o fluxo ou o custo das ruas, não sei... tenho de pensar melhor sobre o problema.

Gerir a frota de veiculos e mais uma questão de fluxo minimo, penso eu.

Boa tarde,

Muito obrigada pelas dicas. Relativamente à primeira parte podes ajudar-me como se faz?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.