zoukankan      html  css  js  c++  java
  • JAVA图的m着色问题

    题目:
    题目描述

    给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的2个顶点着不同颜色,请输出着色方案。

    输入

    输入第一行包含n,m,k分别代表n个结点,m条边,k种颜色,接下来m行每行有2个数u,v表示u和v之间有一条无向边,可能出现自环边,所以请忽略自环边。

    输出

    输出所有不同的着色方案,且按照字典序从小到大输出方案。

    样例输入 Copy

    3 3 3
    1 2
    1 3
    2 3

    样例输出 Copy

    1 2 3
    1 3 2
    2 1 3
    2 3 1
    3 1 2
    3 2 1

    package book;
    
    import java.util.Scanner;
    /*
     * 总结:图的m色问题
     * 给第t个点着色,要判断与该点有边的点着色的颜色是否一样
     * 对于第t个点,做一个循环,m种颜色每种都要试试,不符合条件就剪掉
     */
    public class pic {
    static int x,y,z;
    static int grh[][];
    static int colors[];
    
    	public static void main(String[] args) {
    		Scanner sc=new Scanner(System.in);
    		x=sc.nextInt();//节点数
    		y=sc.nextInt();//边数
    		z=sc.nextInt();//颜色数
    		grh=new int[x+1][x+1];
    	    colors=new int[x+1];//每个点着色
    	    for(int i=1;i<=x;i++) {
    	    	colors[i]=0;
    	    }
    		for(int i=1;i<=y;i++) {
    			int start=sc.nextInt();
    			int end=sc.nextInt();
    			if(start!=end) {
    				grh[start][end]=1;
    				grh[end][start]=1;
    			}
    		}//初始化地图
    	   backtrace(1,z);
    
    	}
    
    	private static void backtrace(int t, int m) {
    		if(t>x) {
    			for(int h=1;h<=x;h++) {
    				System.out.print(colors[h]+" ");
    			}
    			System.out.println();
    		}else {
    			for(int i=1;i<=m;i++) {
    				if(check(t,i)==1) {
    					colors[t]=i;
    					backtrace(t+1,m);
    				}
    			}
    		}
    		
    	}
    
    	private static int check(int t, int i) {
    		for(int k=1;k<t;k++) {
    			if(grh[t][k]==1&&colors[k]==i) {
    				return 0;
    			}
    		}
    		return 1;
    		
    	}
    
    }
  • 相关阅读:
    基本STRUTS标签-学习笔记-Logic标签
    Static的使用
    模板template
    iostream与iostream.h的区别
    数据库连接池
    canvas基础
    javascript面试题集
    ES6新特性学习
    原型和原型链
    css为tbody或者li奇数偶数行样式
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13309595.html
Copyright © 2011-2022 走看看