zoukankan      html  css  js  c++  java
  • (Java实现) 图的m着色问题

    图的m着色问题
    【问题描述】
    给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的。图的m着色问题是对于给定图G和m种颜色,找出所有不同的着色法。
    【编程任务】
    对于给定的无向连通图G和m种不同的颜色,编程计算图的所有不同的着色法。
    【输入格式】
    第1行有3个正整数n,k 和m,表示给定的图G有n个顶点和k条边,m种颜色。顶点编号为1,2,…,n。接下来的k行中,每行有2个正整数u,v,表示图G 的一条边(u,v)。
    【输出格式】
    程序运行结束时,将计算出的不同的着色方案数输出。
    【输入样例】
    5 8 4
    1 2
    1 3
    1 4
    2 3
    2 4
    2 5
    3 4
    4 5
    【输出样例】
    48

    【解题思路】
    其实这道题刚开始依然没思路(搜索刚开始做得太不熟练,,,。。。求原谅),fye大爷再次典型梦中人!!!!
    经大爷点拨之后这道题就非常清晰了。。。其实我们可以用到类似前面部落卫队的思路:仇敌关系和颜色关系其实可以用同一种表示方法;
    f[i][j]表示与i相连的点有几个是颜色j;
    因为同色的不能连在一起,所以f[i][j]为0时可取,非0时不可取;
    因为周围有可能有很多个相同颜色的点,所以f数组必须是一个计数器(int),而不能是bool;
    就这么着。。。


    import java.util.HashSet;
    import java.util.Scanner;
    import java.util.Set;
    
    
    public class tudemzhaosewenti {
    	public static Set<String> set = new HashSet<String>();
    	public static int n,k,m,a,b,count=0;
    	public static int [] [] num;
    	public static int []  color;
    	public static boolean [] bool;
    	public static void main(String[] args) {
    		Scanner sc =new Scanner(System.in);
    		 n = sc.nextInt();
    		 k = sc.nextInt();
    		 m = sc.nextInt();
    		 num = new int [n+1][n+1];
    		 color = new int [n+1];
    		 bool = new boolean [m+1];
    		 for (int i = 0; i < k; i++) {
    			a=sc.nextInt();
    			b=sc.nextInt();
    			num[a][b]=num[b][a]=1;
    		}
    		 f(1,"");
    		 System.out.println(count);
    		 
    	}
    	public static void f(int ren,String s){
    		if(ren==n+1){
    			set.add(s);
    			count++;
    			return;
    		}
    		for (int i = 1; i <=m; i++) {
    		//	if(!bool[i]){
    				int boo = 0;
    			for (int j = 1; j <=n; j++) {
    				if(num[ren][j]==1 && i==color[j] ){
    					boo=1;
    					break;
    				}
    			}
    			if(boo==0){
    				
    			bool[i]=true;
    			color[ren]=i;
    			f(ren+1,s+i);
    			color[ren]=0;
    			bool[i]=false;
    			}
    		//	}
    		}
    		
    	}
    
    }
    
    
  • 相关阅读:
    博客链接--竹子
    升级sudo至1.9.5p2,修复sudo漏洞
    使用Jenkins自动打包部署前端
    升级sudo至1.9.5p2,修复sudo漏洞
    60行C代码实现一个shell
    copy_{to, from}_user()的思考
    Code Server 是什么?
    Linux常用命令学习(5)
    Linux sudo权限提升漏洞(CVE-2021-3156)
    厚书读薄丨《Vim实用技巧》第一部分 模式
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13079095.html
Copyright © 2011-2022 走看看