else fprintf (out,"No cycles.");
delete rebra;
delete s.stek;
delete versh;
fclose(in);
fclose(out);
return (result);
}
5. Тесты
№ |
Граф |
Исходный файл |
Конечный файл |
1 |
5 10 1 2 1 3 1 4 1 5 3 2 3 4 3 5 5 2 5 4 2 4 |
The cycles are: 1 3 2 1 4 3 2 1 5 4 3 2 3 5 4 2 5 4 3 2 4 3 |
|
2 |
10 12 2 1 2 3 3 1 3 4 7 4 7 5 7 6 5 6 4 10 9 10 9 8 8 10 |
The cycles are: 1 3 2 7 6 5 10 8 9 |
|
3 |
8 8 1 2 2 3 2 4 4 7 4 8 5 8 6 7 6 5 |
The cycles are: 4 8 5 6 7 |
|
4 |
4 4 1 2 1 4 4 2 3 2 |
The cycles are: 1 4 2 |
|
5 |
4 3 1 2 2 3 2 4 |
No cycles. |
6. Список литературы
1. Иванов Б. Н. Дискретная математика. Алгоритмы и программы. – М.: Лаборатория базовых знаний, 2001.
2. Кофман А. Введение в прикладную комбинаторику. – М.: Наука, 1975.
7. Дополнение
Не рекурсивная реализация этого алгоритма выглядит следующим образом:
#include <stdio.h>
struct stack
{ int *stek;
int top;
} s,p;
int nreb,nver=0;
int **result=NULL,**rebra,*versh;
FILE *in,*out;
void fillmat(int x, int y, int n)
{ int k=0;
if (x<y)
while (!(x==rebra[k][0]&&y==rebra[k][1])) k++;
else
while (!(x==rebra[k][1]&&y==rebra[k][0])) k++;
result[k][n]=1;
}
void write (int x,int hstack)
{ static int n=0;
do { fprintf (out,"%d ",s.stek[hstack]);
fillmat(s.stek[hstack],s.stek[hstack-1],n);
hstack--;
}
while (s.stek[hstack]!=x);
fprintf (out,"\n");
n++;
}
void vvodreber()
{ int i,j,first,second;
rebra = new int *[nreb];
for (i=0;i<nreb;i++)
rebra[i]=new int [3];
for (i=0; i<nreb; i++)
{ fscanf (in,"%d",&first);
fscanf (in,"%d",&second);
if (first<second)
{ rebra[i][0]=first;
rebra[i][1]=second;
}
else
{ rebra[i][0]=second;
rebra[i][1]=first;
}
rebra[i][2]=0;
}
}
int** main()
{ in = fopen("graf.txt","r");
out= fopen("cycles.txt","w");
int i,j;
fscanf (in,"%d",&nver);
fscanf (in,"%d",&nreb);
vvodreber();
int cycles=nreb-nver+1;
if (cycles>0)
{ fprintf (out,"The cycles are:\n");
versh=new int [nver];
for (i=0;i<nver;i++)
versh[i]=0;
result= new int *[nreb];
for (i=0;i<nreb;i++)
result[i]=new int [cycles];
for (i=0;i<nreb;i++)
for (j=0;j<cycles;j++)
result[i][j]=0;
s.stek = new int [nver+1];
p.stek = new int [nver+1];
int v=1,k;
s.top = 0;
p.top = 0;
s.stek[0]=v;
p.stek[0]=0;
while (s.top>=0)
{ versh[v-1]=1;
v=0;
for (p.stek[p.top];p.stek[p.top]<nreb&&v==0;p.stek[p.top]++)
{
if (rebra[p.stek[p.top]][2]==0)
{ if (rebra[p.stek[p.top]][0]==s.stek[s.top])
v=rebra[p.stek[p.top]][1];
if (rebra[p.stek[p.top]][1]==s.stek[s.top])
v=rebra[p.stek[p.top]][0];
}
}
if (v!=0)
{ rebra[p.stek[p.top]-1][2]=1;
s.top=s.top+1;
s.stek[s.top]=v;
p.top=p.top+1;
p.stek[p.top]=0;
if (versh[v-1]!=0) { write (v,s.top);
s.top=s.top-1;
p.top=p.top-1;
v=s.stek[s.top];
}
}
else { s.top=s.top-1;
p.top=p.top-1;
v=s.stek[s.top];
}
}
}
else fprintf (out,"No cycles.");
delete rebra;
delete s.stek;
delete versh;
return (result);
fclose(in);
fclose(out);
}
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.