Afficher les amis des amis a partir de matrice adj

Résolu/Fermé
zey - 30 juil. 2018 à 22:48
 zey - 1 août 2018 à 17:21
Bonjour,

SVP aidez moi a recuperer les succeseurs directe et indircet d'un noeud dans un graphe avec java.
j'ai pu récupérer dans un ArrayList<ArrayList<Integer>> les successeurs direct mais pour les successeurs indirect je n'ai pas su le faire


1 réponse

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
31 juil. 2018 à 18:01
Bonjour,

Si tu as une méthode
Set<Integer> getFriends(List<List<Integer>> matrix, Integer id)
qui te renvoie les amis, il te suffit d'appeler à nouveau cette méthode pour calculer chacun des amis de ces amis.

public static Set<Integer> getFriendsOfFriends(List<List<Integer>> matrix, Integer id) {
    Set<Integer> result = new HashSet<>();
    for (Integer friend : getFriends(matrix, id)) {
        result.addAll(getFriends(matrix, friend));
    return result;
}

Remarque : mathématiquement, il serait également possible de calculer le carré de ta matrice d'adjacence, et refaire le même calcul mais avec cette nouvelle matrice.

public static Set<Integer> getFriendsOfFriends(List<List<Integer>> matrix, Integer id) {
    return getFriends(square(matrix), id);
}

Cette méthode est un peu plus compliqué à mettre en place (il faut savoir calculer le carré d'une matrice) mais elle permet de gagner en efficacité car on calcule une seule fois la deuxième matrice et après chaque calcul est beaucoup plus rapide.
0
Merci pour votre reponse.
j'ai tenté aussi de faire ca :


int indice ; //l'indice de user cible 
Boolean[] visited ;

//initialisation
      NbreUser= ListUsers.size();  //recuperer le nombre des users
      visited = new Boolean[NbreUser];
      TabDistance = new Integer[NbreUser];  //je recupere ds ce tableau la distance de chaque user par rapport a user cible
//initialisation des tableaux
     for (int i = 0; i < NbreUser; i++) {
        TabDistance[i]=distanceFromSource;
        visited[i]= false;
    }
     
     //traitement
     int courant = indice;
     TabDistance[courant]=0;
     Queue<Integer> pile = new LinkedList<Integer>();
     pile.add(courant);
     visited[courant]= true;
     while(!pile.isEmpty()){
         
         courant=pile.poll();
         
         System.out.println("user "+ courant + "  est visité");
        for (int i = 0; i < matTrust.get(courant).size(); i++) {
        
        int succ=matTrust.get(courant).get(i);
            if (visited[succ]==false){
                pile.add(succ);
                visited[succ]= true;
                TabDistance[succ]=TabDistance[courant]+1;
             }
        }//fin for
    }//fin while(!pile.isEmpty()


merci encore une fois
0