2013-04-07 5 views
1

Je suis novice en matière de structures de données liées et je me demandais comment créer un graphe non orienté lorsqu'on lui donnait 2 points à partir d'un tableau 2d et qu'aucun poids n'était déterminé entre les points. J'ai cherché autour et je ne pouvais pas vraiment trouver ce que je cherchais.Créer des structures de données liées à partir du tableau

Exemple:

int[][] points = { { 0, 1 },{ 0, 2 },{ 1, 2 },{ 1, 3 },{ 3, 4 } }; 

étirées il devrait ressembler à ceci.

 0 
     | 
    ------- 
    |  | 
    1-----2 
    | 
    3-----4 

EDIT

Je veux aussi être en mesure de trouver le chemin le plus court de 0 à 4 et traversant à chaque point au moins une fois en comptant chaque mouvement le long du chemin. Il est possible que vous deviez reculer. Dans l'exemple ci-dessus, le chemin le plus court de 0 à 4 est (0-2) (2-1) (1-3) (3-4) et compte pour être 4 coups.

+1

Je commence par penser réellement à ce que la structure de données que vous voulez finir avec et par écrit au moins une mise en œuvre factice. Il y a plusieurs représentations possibles pour les graphiques, et elles peuvent être implémentées différemment, donc on ne sait pas lequel on veut construire. (Par exemple, votre int int [] [] 'est déjà une structure de données de graphe parfaitement valide.) – millimoose

+0

Essayez-vous de lire une liste de tronçons? Dans quelle structure? –

+0

Je viens d'éditer ma question. Devrait être plus clair sur ce que j'essaie de faire. – mjenkins2010

Répondre

2
  1. Créer une classe Noeud qui contient une liste des noeuds adjacents
  2. à travers vos nœuds Itérer dans le tableau des points . Créer un objet de nœud pour chaque nœud que vous trouverez (probablement il serait préférable de les garder dans une carte au début.
  3. Itérer encore une fois et remplir la liste des noeuds adjacents pour chaque noeud.

Considérez cette classe noeud:

public class Node { 
    private int id; 
    private List<Node> adjacentNodes = new ArrayList<Node>(); 

    public List<Node> getAdjacentNodes() { 
     return adjacentNodes; 
    } 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 
} 

et cette méthode crée une collection de tous les nœuds et ils sont reliés entre eux:

private static Collection<Node> createGraphNodes(int[][] pointsMatrix) { 
    Map<Integer, Node> nodes = new HashMap<Integer, Node>(); 
    for(int[] points: pointsMatrix) { 
     for(int point: points) { 
      if(nodes.containsKey(Integer.valueOf(point))) { 
       continue; 
      } 

      Node node = new Node(); 
      node.setId(point); 
      nodes.put(point, node); 
     } 
    } 

    for(int[] points: pointsMatrix) { 
     int nodeId1 = points[0]; 
     int nodeId2 = points[1]; 

     Node node1 = nodes.get(Integer.valueOf(nodeId1)); 
     Node node2 = nodes.get(Integer.valueOf(nodeId2)); 

     node1.getAdjacentNodes().add(node2); 
     node2.getAdjacentNodes().add(node1); 

    } 

    return nodes.values(); 
+0

J'ai beaucoup travaillé pour apporter cette réponse alors n'oubliez pas d'accepter si cela aide. Merci! – Avi

+0

Existe-t-il un moyen de trouver un chemin entre les nœuds comme ce que j'ai expliqué dans mon édition? J'apprécie vraiment cela. – mjenkins2010

+0

L'algorithme de chemin que vous recherchez ressemble à une question différente. J'ouvrirais un autre poste si j'étais vous. – Avi

2

La façon la plus simple de représenter des graphiques est d'utiliser la matrice de contiguïté, qui est une matrice booléenne à deux dimensions dans lequel les lignes et les colonnes représentent des noeuds dans le graphique, et l'intersection entre les états d'une ligne et d'une colonne s'ils sont connectés. Il en contient un s'ils sont connectés à zéro sinon.

Par exemple, votre graphique ci-dessus sera:

 0 1 2 3 4 
0 [0] [1] [1] [0] [0] 
1 [1] [0] [1] [1] [0] 
2 [1] [1] [0] [0] [0] 
3 [0] [1] [0] [0] [1] 
4 [0] [0] [0] [1] [0] 
+0

Est-ce que array [1] [3] ne devrait pas avoir un [1] avec array [3] [1]? et array [3] [0] être 0? Je ne fais que demander. – mjenkins2010

+0

Oui, corrigé. –

+0

Comment pourrais-je parcourir le chemin et compter chaque coup? Pardon. Probablement une question stupide. Je ne comprends pas comment j'implémenterais dans le code. – mjenkins2010

Questions connexes