From 9fe033ea88c2f705ec18c232873d056e0c229d72 Mon Sep 17 00:00:00 2001 From: Gaspard Coulet Date: Wed, 28 Apr 2021 23:05:53 +0200 Subject: Initial commit --- sem_5/HLIN501_Graphes/TP/TP4/tp4.cc | 170 ++++++++++++++++++++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100644 sem_5/HLIN501_Graphes/TP/TP4/tp4.cc (limited to 'sem_5/HLIN501_Graphes/TP/TP4/tp4.cc') diff --git a/sem_5/HLIN501_Graphes/TP/TP4/tp4.cc b/sem_5/HLIN501_Graphes/TP/TP4/tp4.cc new file mode 100644 index 0000000..40fd343 --- /dev/null +++ b/sem_5/HLIN501_Graphes/TP/TP4/tp4.cc @@ -0,0 +1,170 @@ +#include +#include +#include +#include +#include + +using namespace std; + +const int N=1400; +const int M=(N*(N-1))/2; + +typedef struct coord{int abs; int ord;} coord; + +void pointRandom(int n,coord point[]); +float distancexy(coord p1,coord p2); +void voisins(int n,int dmax,coord point[],vector voisin[],int &m); +void voisins2arete(int n,vectorvoisins[],int arete[][2]); +void affichageGraphique(int n,int m,coord point[],vector voisins[],const char * name); +bool existe(int n,int dis[],bool traite[]); +int searchsmallest(int n, int dist[],bool traite[]); +void dijkstra(int n,vector voisin[],coord point[],int pere[], int m); +int construireArbre(int n,vector voisin[],int pere[]); + +int +main() +{ + int n; // Le nombre de points. + cout << "Entrer le nombre de points: "; + cin >> n; + int dmax=50; // La distance jusqu'a laquelle on relie deux points. + coord point[N]; // Les coordonnees des points. + vector voisin[N]; + vector voisinbis[N]; // Les listes de voisins. + int arbre[N-1][2]; // Les aretes de l'arbre de Dijkstra. + int pere[N]; // La relation de filiation de l'arbre de Dijkstra. + int m; // Le nombre d'aretes + int arete[M][2]; // Les aretes du graphe + pointRandom(n,point); + voisins(n,dmax, point, voisin, m); + const char * filename = "affichage.ps"; + affichageGraphique(n,m,point,voisin,filename); + cout<<"Graphe de base créé et exporté vers "< voisins[], int &m){ + int arrete = 0; + for (int i = 0; i < n; i ++){ + for (int j = i+1; j < n; j ++){ + if ( sqrt(pow(point[i].abs-point[j].abs,2)+pow(point[i].ord-point[j].ord,2))<=dmax){ + voisins[i].push_back(j); + voisins[j].push_back(i); + arrete++; + } + } + } + m=arrete; +} + +void affichageGraphique(int n, int m, coord point[], vector voisins[], const char * filename) +// Cree le fichier Exemple.ps qui affiche +// les points et l'arbre de Kruskal. +{ + ofstream output; + output.open(filename,ios::out); + output << "%!PS-Adobe-3.0" << endl; + output << "%%BoundingBox: 0 0 612 792" << endl; + output << endl; + for(int i=0;i= i){ + output << point[i].abs<<" "< voisin[], coord point[], int pere[], int m){ + int d[n]; + bool traite[n]; + for (int i =0; i < n; i ++){ + d[i]= -1; + traite[i]=false; + } + pere[0]=0; + d[0]=0; + while (existe(n,d,traite)){ + int current = searchsmallest(n,d,traite); + //cout<<"C'est ti-par avec current = "<< current <(d[x]+distancexy(point[x],point[y]))))){ + d[y]=d[x]+distancexy(point[x],point[y]); + pere[y]=x; + } + } + } +} +int construireArbre(int n,vector voisin[],int pere[]){ + for ( int i = 0; i < n; i ++){ + voisin[i].push_back(pere[i]); + voisin[pere[i]].push_back(i); + } + return n; +} -- cgit v1.2.3