图着色问题
2016-04-02 20:51
253 查看
1、有m种颜色,对n个节点进行着色,相邻节点颜色不能相同,可以有多少种着色方法?回溯
2、有一个n×n的矩阵,最少可以用多少颜色进行着色,相邻的两个节点颜色不能相同。解法:贪心算法,首先根据节点的度数进行排序,依次给度数较大的节点着色。
package com.wangyi; import java.util.Arrays; public class GraphColor { public static void main(String[] args) { // TODO Auto-generated method stub GraphColor c=new GraphColor(); c.addColor(); System.out.println(c.count); } //m种颜色,可以有多少不同的着色法 int count=0;//成功着色的个数 int n=0; int color[]; int m=0; int [][]res={{0,1,1,1,0},{1,0,0,0,1},{1,0,0,0,1},{1,0,0,0,1},{0,1,1,1,0}}; public void addColor(){ n=res.length; m=2; color=new int ; Arrays.fill(color, -1); backTrace(0); } public void backTrace(int i){ if(i>=n){ count++; }else{ for(int j=0;j<m;j++){ color[i]=j; if(isOk(i))backTrace(i+1); color[i]=-1; } } } public boolean isOk(int i){ for(int j=0;j<n;j++){ if(res[i][j]==1&&color[j]==color[i])return false; } return true; } }
2、有一个n×n的矩阵,最少可以用多少颜色进行着色,相邻的两个节点颜色不能相同。解法:贪心算法,首先根据节点的度数进行排序,依次给度数较大的节点着色。
package com.wangyi; import java.util.Arrays; import java.util.Comparator; public class GraphColor2 { public static void main(String[] args) { // TODO Auto-generated method stub GraphColor2 c=new GraphColor2(); c.addColor(); System.out.println(c.count); } //至少需要多少种颜色 int count=0; int n=0; int color[]; int [][]res={{0,1,1,1,0},{0,0,0,0,1},{0,0,0,0,1},{1,0,0,0,1},{0,1,1,1,0}}; public void addColor(){ n=res.length; color=new int ; // sort array by degree int[] temp=calculateDu(); //set color according to degree for(int i=0;i<n;i++){ int colori=0; color[temp[i]]=colori; while(!isOk(temp[i])){ colori++; color[temp[i]]=colori; count=Math.max(count, colori+1); } } } public int[] calculateDu(){ int val[]=new int ; for(int i=0;i<n;i++){ int num=0; for(int j=0;j<n;j++){ if(res[i][j]==1)val[i]=++num; } } Pair[] pairs=new Pair ; for(int i=0;i<n;i++){ pairs[i]=new Pair(i,val[i]); } Arrays.sort(pairs,new Comparator<Pair>(){ @Override public int compare(Pair arg0, Pair arg1) { // TODO Auto-generated method stub if(arg0.val>arg1.val)return 1; else if(arg0.val==arg1.val)return 0; return -1; } }); for(int i=0;i<n;i++){ val[i]=pairs[i].index; } return val; } public boolean isOk(int i){ for(int j=0;j<n;j++){ if(res[i][j]==1&&color[j]==color[i])return false; } return true; } class Pair{ int index; int val; public Pair(int index,int val){ this.index=index; this.val=val; } } }
相关文章推荐
- poj1129
- 图着色问题
- 贪心,二叉树搜索,ZOJ(2315)
- Android数据绑定组件RoboBinding使用详解
- 高性能MySQL笔记-第1章MySQL Architecture and History-001
- C++中文件流(fstream)的使用方法及示例
- java源文件的声明原则
- 第63课:Spark SQL下Parquet内幕深度解密学习笔记
- spfa双端优化模板
- flex&&bison
- HD 1159 Common Subsequence (最长公共子序列)
- 团队项目-smart原则
- 线性表顺序存储结构实现
- 7 面向对象(成员变量和局部变量的区别,类作为形式参数的问题,匿名对象,封装,private关键字,this关键字,构造方法,类的初始化过程,static关键字)
- 飛飛(十七)用递归方法求a!
- Java动态代理
- 一个Android图片(视频)选择器:android-media-picker
- WebLogic、WebSphere、JBOSS、Tomcat之间的区别 2
- “浪潮杯”山东省赛 sdut 3256 BIGZHUGOD and His Friends II
- onAnimationEnd不一定能执行