되추적 색칠

Haechan Kim·2021년 11월 17일
0

알고리즘

목록 보기
23/28
public class Main
{
    int n; // 그래프 정점의 수
    int m; // 색들의 수
    int[] vcolor; // 정점에 칠해진 색들의 배열
	public static void main(String[] args) 
	{
	    Main col = new Main();
	    col.vcolor = new int[10];
	    int[][] G = {
	        {0,1,0,0,0,1},
	        {1,0,1,0,1,0},
	        {0,1,0,1,0,0},
	        {0,0,1,0,1,0},
	        {0,1,0,1,0,1},
	        {1,0,0,0,1,0},
	    };
	    
	    col.n = 6; // 정점의 수
	    col.m = 3; // 색의 수
	    
	    // 무방향 그래프의 정점들을 색칠하는 모든 방법을 출력
	    col.m_coloring(G, 0);
	}
	
	public void m_coloring(int[][] G, int i)
	{ // G를 색칠하는 모든 방법을 출력한다.
	    int color;
	    if (valid(G, i)) // 유효하다면
	    {
	        if (i == n) // 출력
	        {
	            System.out.print(" 색칠하기: ");
	            for (i=1; i<=n; i++)
	            {
	                System.out.print("정점 " + i + "의 색 = " + vcolor[i] + ", ");
	                //System.out.print("정점" + 1);
	            }
	            System.out.println();
	            return;
	        }
	        else 
	        {
	            for (color = 1; color <= m; color++)    
	            {
	                vcolor[i+1] = color;
	                m_coloring(G, i+1);
	            }
	        }
	    }
	}
	
	public boolean valid(int[][] G, int i)
	{
	    int j = 1;
	    while (j<i)
	    { // 정점 i의 색이 인접한 점점들의 색과 같은지 확인
	        if (G[i-1][j-1] == 1 && vcolor[i] == vcolor[j])
	        { // 인접하지 않거나, 인접해도 색 같으면 false
	            return false;
	        }
	        j++;
	    }
	    return true;
	}
}

0개의 댓글

관련 채용 정보