samhmi
Messages postés
2
Date d'inscription
mardi 24 février 2009
Statut
Membre
Dernière intervention
24 février 2009
24 févr. 2009 à 17:04
J'ai utilisé un tri par sélection, le résultat est bon pour les degrés mais pour les arcs ne marche pas
voici mon code:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
typedef struct
{
int degre;
int arc[10];
} sommet;
void remplir( sommet tab[],int U1[],int k,int n);
int remplissage(int n,int k,int debut[],int fin[],int M[10][10]);
void tri( sommet tab[],int n);
int maxi(int a,int b);
main()
{
int i,n,k,t,p,q;
int j=0,max=0;
sommet tab[10];
FILE *fp;
char name[FILENAME_MAX];
char s[100];
int debut[10];
int fin[10];
int U[10];
int U1[10],U2[10],debut1[10],fin1[10];
int M[10][10],A[10][10];
printf("donner le nom de fichier: ");
scanf("%s",name);
fp=fopen(name,"r");
if (fp== NULL) {
printf("erreur");
return 1;
}
if(fp)
{
while(!(fscanf(fp,"%d %d", &debut[j],&fin[j]) == EOF))
{
printf("%d %d\n", debut[j],fin[j]);
U[j]=j+1;
j++;
}
fclose(fp);
}
k=j;
p=debut[0];
for(i=0;i<=k-1;i++)
{
if(debut[i]>=p)
p=debut[i];
}
q=fin[0];
for(i=0;i<=k-1;i++)
{
if(fin[i]>=q)
q=fin[i];
}
if(p>=q)
n=p;
else n=q;
printf(" le nombre des sommet est:%d\n",n);
printf("le nombre des arcs est:%d\n",k);
printf("MATRICE D'INCIDENCE\n");
remplissage(n, k, debut, fin,M) ;
// algo 2
for(i=0;i<=n-1;i++)
{
tab[i].degre=0;
for(j=0,t=0;j<=k-1||t<=k-1;j++,t++)
{
if(M[i][j]==1||M[i][j]==-1)
{
tab[i].degre++;
tab[i].arc[t]=j+1;
printf(" ARC %2d :",tab[i].arc[t]);
}
}
printf("%2d\n",tab[i].degre);
}
tri(tab,n);
remplir(tab,U1,k,n);
getch();
return(0);
}
void tri( sommet tab[10],int n)
{
int i,t,j,max,l;
int c;
int f;
for(i=0;i<=n-1;i++)
{
max=i;
int d[10];
for(j=i+1;j<=n-1;j++)
{
if(tab[j].degre>tab[max].degre)
{
max=j;
if(max!=i)
{
//copie champ par champ
c=tab[i].degre;
for(t=0;t<=tab[i].degre-1;t++)
{
d[t]=tab[i].arc[t];
}
tab[i].degre=tab[j].degre;
l=maxi(tab[i].degre,tab[j].degre);
for(t=0;t<=l;t++)
{
tab[i].arc[t]=tab[j].arc[t];
}
tab[j].degre=c;
for(t=0;t<= tab[j].degre-1;t++)
{
tab[j].arc[t]=d[t];
}
}
}
}
}
for(i=0;i<=n-1;i++)
{
for(t=0;t<=1;t++)
printf("ARC %d :",tab[i].arc[t]);
printf("DEGRE %d ",tab[i].degre);
printf("\n");
}
}
void remplir( sommet tab[10],int U1[10],int k,int n)
{
int i,j,t;
int B[]={0,0,0,0,0,0};
for(i=0,j=0;i<=n-1&&j<=k-1;i++,j++)
{
if (B[j]==0)
{
for(t=0;t<=(tab[i].degre)-1;t++)
{
U1[j]=tab[i].arc[t];
B[j]=1;
}
printf("U1 %d ",U1[j]);
}
}
}
int remplissage(int n,int k,int debut[],int fin[],int M[10][10])
{
int i,j,l;
for(j=0,l=0;j<=k-1 &&l<=k;j++,l++)
{
for(i=0;i<=n-1;i++)
{
if(fin[l]==i+1 && j==l)
M[i][j]=-1;
else if(debut[l]==i+1 && j==l )
M[i][j]=1;
else
M[i][j]=0;
}
}
for(i=0;i<=n-1;i++)
{
for(j=0;j<=k-1;j++)
{
if(M[i][j]==-1)
printf("%d ", M[i][j]);
else printf(" %d ", M[i][j]);
}
printf("\n");
}
}
int maxi(int a,int b)
{
if(b>=a)
return b;
else return a;
}