Добавил:
FluffyUnicorn
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Структуры данных примеры / Граф / cycles
.cpp//Поиск всех циклов в графе
#include <conio.h>
#include <iostream>
#define N 7
using namespace std;
int G[N][N]={{0,1,1,0,0,0,0},
{1,0,1,0,0,0,0},
{1,1,0,1,0,0,0},
{0,1,0,0,1,0,0},
{0,0,0,0,0,1,0},
{0,0,0,1,1,0,0},
{1,0,0,0,0,0,0}},
P[N], k;
int next (int i, int cur)
{
cur++;
while (cur<N && !G[i][cur]) cur++;
if (cur<N) return cur;
return -1;
}
void Cycle (int x)
{
int y, i;
P[++k]=x;
y = -1; //N(a):=V(a)
while ((y = next(x,y))>-1) //пока есть следующая смежная вершина
{
if (y==P[0]) //если эта вершина совпадает с первой
{
if (k>1) //если длина пути больше 3
{
for (i=0; i<=k; i++)
cout<<P[i]<<" "; //выводим циклический путь
cout<<P[0]<<endl;
}
}
else
{
for (i=1; i<=k && P[i]!=y; i++); //ищем текущую вершину среди вершин пути
if (i>k)
Cycle (y); //если вершина y еще не посещалась
}
}
k--;
}
void DelNodeNoCycle(void)
{
int i, j, f1, f2, f3;
do
{
f1=0;
for (i=0; i<N; i++)
{
for (f3=f2=j=0; j<N; j++)
{
f2=f2||G[i][j];
f3=f3||G[j][i];
}
if (f2!=f3)
{
for (j=0; j<N; j++)
G[i][j]=G[j][i]=0;
f1=1;
}
}
}
while (f1);
}
main()
{
int a,b;
DelNodeNoCycle();
for (a=0; a<N; a++)
{
k=-1;
Cycle(a);
for (b=0; b<N; b++)
G[a][b]=G[b][a]=0;
}
getch();
return 0;
}