#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#define nmax 14
#define kmax nmax *(nmax-1)/2
#define randomize() srand(unsigned(time(NULL)))
#define random(a) rand()%a
#define Random() (rand()%10000)*0.0001
enum Boolean {falsz=0, prawda=1};
typedef struct
{
int a, b;
enum Boolean code;
}r;
typedef r t1[kmax]; // E
typedef int t[nmax];
void Gnf1(int n, int f, int total, t1 E, int *k) ;
void drukE(int total, t1 E);
void drukE1(int total, t1 E);
void init(int n, t1 E, int * total);
void drukc(int n, t c);
int main()
{
int n, f, total, rep,k,repx,repr;
t1 E;
int *rozklad;
//randomize();
printf("Podaj n: ");
scanf("%d",&n);
printf("\nPodaj f:" );
scanf("%d",&f);
printf("\nPodaj rep:" );
scanf("%d",&rep);
printf("n=%d f=%d\n",n,f);
init(n, E, &total);
printf("Ilosc krawedzi: %d\n",total);
rozklad=(int *) malloc(total *sizeof(int));
if (rozklad == NULL) printf("cos nie tak");
while(rep)
{
Gnf1(n,f,total, E, &k);
rozklad[k]=rozklad[k]+1;
rep--;
};
//drukE1(total,E);
//printf("\n%d\n", k);
for (repr=1; repr<total; repr++)
{
printf("%d ", rozklad[repr]);
};
system("PAUSE");
return 0;
}
void drukE(int total, t1 E) // dla Gnf
{
int h,l;
printf("\nE:");
h=0;
for(l=1;l<=total;l++)
{
printf("%4d%2d",E[l].a,E[l].b);
h++;
if(h%10==0)
printf("\n");
}
printf("\n");
} //drukE1
void drukE1(int total, t1 E) // dla Gnf
{
int h,l;
char x;
printf("\nE:");
h=0;
for(l=1;l<=total;l++)
{
if (E[l].code)
x='T';
else x='N';
printf("%4d%2d%c",E[l].a,E[l].b,x);
h++;
if(h%10==0)
printf("\n");
}
printf("\n");
} //drukE1
void init(int n, t1 E, int * total)
{
int i,j,h;
h=0;
for(i=1;i<=n-1; i++)
for(j=i+1; j<=n;j++)
{
h++;
E[h].a=i;
E[h].b=j;
}
*total=h;
} //init
void Gnf1(int n, int f, int total, t1 E, int *k) //EM f-graf
/* generacja grafu losowego o stopniu wierzcholkow nie wiekszym od f
EM oznacza Edge Maximal, czyli o najwiekszej mozliwej liczbie krawedzi*/
{
int i,h,l,z,los;
r x;
t c;
for(i=1;i<=n;i++)
c[i]=0; // aktualny ciag stopni wierzcholkow
for(i=1;i<=total;i++)
E[i].code=falsz; //przygotowanie pola code w E
h=0; //licznik krawedzi
for(l=total;l>=1;l--) //ostatni indeks roboczej czesci E
{
z=random(l)+1; // losuj indeks z roboczej czesci E
los=random(1000);
if (los>=500)
{
if((c[E[z].a]<f)&&(c[E[z].b]<f)) //krawedz (a,b)
{
E[z].code=prawda;
h++;
c[E[z].a]++;
c[E[z].b]++;
}; //zamien wylosowany element E z ostatnim z czesci roboczej
};
x=E[z];
E[z]=E[l];
E[l]=x;
// printf("l= %d, z= %d",l,z);
// drukE1(total, E);
// drukc(n, c);
}
*k=h;
printf("\n%d\n",*k);
} //Gnf1
void drukc(int n, t c)
{
int i;
printf("c:");
for(i=1;i<=n;i++)
printf("%3d",c[i]);
printf("\n");
} //drukc