2024-02-28 12:00:20 +01:00
|
|
|
/**
|
2024-02-29 10:44:39 +01:00
|
|
|
* Classe definissant des graphes au sens mathematiques
|
2024-02-28 12:00:20 +01:00
|
|
|
* @author Luc Dartois
|
|
|
|
* @version 1.0
|
|
|
|
*/
|
|
|
|
|
|
|
|
public class Graphe{
|
|
|
|
/**
|
2024-02-29 10:44:39 +01:00
|
|
|
* Le nombre de sommets du graphe, numerotes de 0 a ordre-1
|
2024-02-28 12:00:20 +01:00
|
|
|
*/
|
|
|
|
private int ordre;
|
|
|
|
/**
|
2024-02-29 10:44:39 +01:00
|
|
|
* Ses aretes donnees sous forme de matrice carre d'adjacence (voir classe MatriceCarre)
|
2024-02-28 12:00:20 +01:00
|
|
|
*/
|
|
|
|
private MatriceCarre adj;
|
|
|
|
/**
|
2024-02-29 10:44:39 +01:00
|
|
|
* Indique si le graphe est oriente ou non
|
2024-02-28 12:00:20 +01:00
|
|
|
*/
|
|
|
|
private boolean oriente;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Construit un graphe vide
|
|
|
|
*@param ord indique l'ordre du graphe
|
2024-02-29 10:44:39 +01:00
|
|
|
*@param o indique s'il est oriente
|
2024-02-28 12:00:20 +01:00
|
|
|
*/
|
|
|
|
public Graphe(int ord,boolean o){
|
|
|
|
this.ordre=ord;
|
|
|
|
this.adj=new MatriceCarre(ord);
|
|
|
|
this.oriente=o;
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* Getter pour l'ordre
|
|
|
|
*@return L'ordre du graphe
|
|
|
|
*/
|
|
|
|
public int getOrdre(){
|
|
|
|
return this.ordre;
|
|
|
|
}
|
|
|
|
/**
|
2024-02-29 10:44:39 +01:00
|
|
|
* Renvoit vrai s'il y a une arete de i a j
|
2024-02-28 12:00:20 +01:00
|
|
|
*@param i,j Deux sommets du graphe
|
2024-02-29 10:44:39 +01:00
|
|
|
*@return Vrai si le graphe possède une arete de i a j
|
2024-02-28 12:00:20 +01:00
|
|
|
*/
|
|
|
|
public boolean getArete(int i,int j){
|
|
|
|
return this.adj.getCoeff(i,j)==1;
|
|
|
|
}
|
|
|
|
/**
|
2024-02-29 10:44:39 +01:00
|
|
|
* Ajoute une arete de i a j
|
2024-02-28 12:00:20 +01:00
|
|
|
*@param i,j Deux sommets du graphe
|
|
|
|
*/
|
|
|
|
public void ajoutArete(int i,int j){
|
|
|
|
if(i>=this.ordre||j>=this.ordre||i<0||j<0){
|
|
|
|
throw new IllegalArgumentException("Erreur : Sommet inexistant.");
|
|
|
|
}
|
|
|
|
this.adj.setCoeff(i,j,1);
|
|
|
|
if(!this.oriente){
|
|
|
|
this.adj.setCoeff(j,i,1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* Affiche la liste des voisins de i
|
|
|
|
*@param i Un sommet du graphe
|
|
|
|
*/
|
|
|
|
public void voisinage(int i){
|
|
|
|
if(!this.oriente){
|
|
|
|
System.out.print("Voisins de "+i+" : ");
|
|
|
|
for(int j=0;j<this.ordre;j++){
|
|
|
|
if(this.adj.getCoeff(i,j)==1){
|
|
|
|
System.out.print(j+", ");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
System.out.println();
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
System.out.print("Voisins sortants de "+i+" : ");
|
|
|
|
for(int j=0;j<this.ordre;j++){
|
|
|
|
if(this.adj.getCoeff(i,j)==1){
|
|
|
|
System.out.print(j+", ");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
System.out.println();
|
|
|
|
System.out.print("Voisins entrants de "+i+" : ");
|
|
|
|
for(int j=0;j<this.ordre;j++){
|
|
|
|
if(this.adj.getCoeff(j,i)==1){
|
|
|
|
System.out.print(j+", ");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
System.out.println();
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* Calcule la somme du nombre de voisins de tous les sommets
|
2024-02-29 10:44:39 +01:00
|
|
|
*@return Un entier representant la somme de tous les voisins.
|
2024-02-28 12:00:20 +01:00
|
|
|
*/
|
|
|
|
public int sommeVoisins(){
|
|
|
|
int s=0;
|
|
|
|
for(int i=0;i<this.ordre;i++){
|
|
|
|
for(int j=0;j<this.ordre;j++){
|
|
|
|
s+=this.adj.getCoeff(i,j);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return s;
|
|
|
|
}
|
|
|
|
|
|
|
|
public String toString(){
|
|
|
|
String s="Graphe ";
|
|
|
|
if(!this.oriente){
|
|
|
|
s+="non ";
|
|
|
|
}
|
|
|
|
s+="oriente de taille : "+this.ordre+".\n";
|
|
|
|
|
|
|
|
return s;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public boolean equals(Graphe g){
|
|
|
|
if(this.ordre!=g.ordre)
|
|
|
|
return false;
|
|
|
|
if(this.oriente!=g.oriente)
|
|
|
|
return false;
|
|
|
|
if(!this.adj.equals(g.adj))
|
|
|
|
return false;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|