Занятие 4. Справочник

Занятие 4. Справочник

Алгоритм поиска в глубину компоненты связности графа, заданного матрицей смежности G
static final int WHITE = 0;
static final int GREY  = 1;
static final int BLACK = 2;

static int[] color = new int [1000];

static void DFS(int v)
{
	color[v] = GREY;
	for (int i = 0; i < N; i++)
	{
		if (G[v][i] == 1 && color[i] == WHITE) DFS(i);
	}
	color[v] = BLACK;
}
Полный обход в глубину произвольного графа, заданного матрицей смежности G (например непосредственно в функции main)
//по всем компонентам связности
for (int i = 0; i < N; i++)
{
	if (color[i] == WHITE)
	{  
		DFS(i);
	}
}
Проверка на двудольность
//по всем компонентам связности
for (int i = 0; i < N; i++)
{
	if (color[i] == WHITE)
	{   part[i] = RED;
		DFS(i);
	}
}

if (!twoparted)
{
	out.println("NO");
}
else
{
	
	out.println("YES");
}
	
	static final int WHITE = 0;
	static final int GREY  = 1;
	static final int BLACK = 2;

	static int[] color = new int[1000];
	
	static final int RED  = 3;
static final int BLUE = 4;
static int[]  part = new int[1000];  
      //twoparted – если true – граф двудолен
      static boolean twoparted = true;

	static void DFS(int v)
	{
	    color[v] = GREY; 
	    
		for (int i = 0; i < N; i++)
		{  
			   if (G[v][i] == 1 && v != i) 
			   {
				   if (part[v] == part[i])
				   {
					   twoparted = false;
					   return;
				   }	   
				   if (color[i] == WHITE)
				   {	   
				       if (part[v] == RED) part[i] = BLUE;
				       else part[i] = RED;
					   DFS(i);
				   }	   
			   }
		}
		color[v] = BLACK;
	}

}