经典图着色算法作业
2016-01-14 11:33
204 查看
核心算法贴出来
算法使用java实现,具体的效果如图
![](http://img.blog.csdn.net/20160114112759461?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20160114112815875?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20160114112826971?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
需要源码和可执行文件包的到我的csdn去下载,地址:
http://download.csdn.net/detail/u013510614/9403562
package ore.lyt.edu.work; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import javax.swing.JOptionPane; import ore.lyt.edu.utils.Log4jUtil; public class WorkColor { private static List<Edge> listEdge = new ArrayList<Edge>(); private static List<Vertex> listVertex = new ArrayList<Vertex>(); private static Map<String, Vertex> vertexMap = new HashMap<String, Vertex>(); private static String resultPath = ""; public static void main(String[] args) { String showInputDialog = JOptionPane.showInputDialog(null, "请输入数据文件的路径:", "输入", JOptionPane.INFORMATION_MESSAGE); try { int tmpCount = showInputDialog.lastIndexOf("\\"); resultPath = showInputDialog.substring(0, tmpCount + 1); } catch (Exception e) { Log4jUtil.logger.error(e.getLocalizedMessage()); Log4jUtil.logger.error("输入路径参数不正确!"); } readFile(showInputDialog); Collections.sort(listVertex, new Comparator<Vertex>() { public int compare(Vertex arg0, Vertex arg1) { return arg0.getSumNextPoint().compareTo(arg1.getSumNextPoint()); } }); RangeColor(); JOptionPane.showMessageDialog(null, "结果文件位于" + resultPath + "下的result.txt中", "提示", JOptionPane.WARNING_MESSAGE); } public static void readFile(String filePath) { try { File file = new File(filePath); if (file.isFile() && file.exists()) { // 判断文件是否存在 InputStreamReader read = new InputStreamReader( new FileInputStream(file)); BufferedReader bufferedReader = new BufferedReader(read); String lineTxt = null; while ((lineTxt = bufferedReader.readLine()) != null) { String[] data = lineTxt.split(" "); Vertex vertex = new Vertex(Integer.parseInt(data[1])); vertex.setId(UUID.randomUUID().toString()); Edge edge = new Edge(Integer.parseInt(data[1]), Integer.parseInt(data[2])); listEdge.add(edge); if (listVertex.size() != 0) { if (listVertex.get(listVertex.size() - 1).getNumber() != vertex .getNumber()) { listVertex.add(vertex); } else { int tmp = listVertex.get(listVertex.size() - 1) .getSumNextPoint(); listVertex.get(listVertex.size() - 1) .setSumNextPoint(tmp + 1); } } else { listVertex.add(vertex); } } read.close(); } else { Log4jUtil.logger.error("找不到指定的文件"); System.out.println("读取文件内容出错"); System.out.println("找不到指定的文件"); } } catch (Exception e) { Log4jUtil.logger.error(e.getLocalizedMessage()); System.out.println("读取文件内容出错"); e.printStackTrace(); } // 记录所有点的邻接点信息 for (int i = 0; i < listEdge.size(); i++) { int tmpNumFirst = listEdge.get(i).getFirstVertex() - 1; int tmpNumSecond = listEdge.get(i).getSecondVertex() - 1; listVertex.get(tmpNumFirst).getNextPoint() .add(listVertex.get(tmpNumSecond).getId()); vertexMap.put(listVertex.get(tmpNumSecond).getId(), listVertex.get(tmpNumSecond)); } } public static void RangeColor() { List<Vertex> colorVertex = new ArrayList<Vertex>();// 存储所有涂上颜色的点 List<String> colorNextVertex = new ArrayList<String>();// 存储所有涂上颜色点的邻接点 int colorNmuber = 0;// 所用颜色的数量 // 给度最大的点着色 Vertex _tmpVertex = listVertex.get(0); _tmpVertex.setVertexColor(1); vertexMap.put(_tmpVertex.getId(), _tmpVertex); colorNmuber++; colorVertex.add(_tmpVertex); colorNextVertex.addAll(_tmpVertex.getNextPoint()); while (colorVertex.size() < listVertex.size()) { // 进行降序排序找到度最大的点 Collections.sort(colorNextVertex, new Comparator<String>() { public int compare(String arg0, String arg1) { Vertex Vertex0 = vertexMap.get(arg0); Vertex Vertex1 = vertexMap.get(arg1); return Vertex0.getSumNextPoint().compareTo( Vertex1.getSumNextPoint()); } }); // 保证该点还没有被涂色 int k; for (k = 0; k < colorNextVertex.size(); k++) { Vertex vertex = vertexMap.get(colorNextVertex.get(k)); if (vertex.getVertexColor() == null) break; } if (k >= colorNextVertex.size()) break; int i; // 从已经用过的颜色中找能再次利用的颜色 for (i = 0; i < colorVertex.size(); i++) { if (!colorVertex.get(i).getNextPoint() .contains(colorNextVertex.get(k))) { int j; for (j = 0; j < colorVertex.size(); j++) { if (colorVertex.get(j).getVertexColor() == colorVertex .get(i).getVertexColor() && colorVertex.get(j).getNextPoint() .contains(colorNextVertex.get(k))) break; } if (j < colorVertex.size()) { continue; } else { String tmpStr = colorNextVertex.get(k); Vertex tmpVertex = vertexMap.get(tmpStr); vertexMap.get(tmpStr).setVertexColor( colorVertex.get(i).getVertexColor()); colorVertex.add(tmpVertex); Vertex vertex = vertexMap.get(colorNextVertex.get(k)); colorNextVertex.remove(colorNextVertex.get(k)); colorNextVertex.addAll(vertex.nextPoint); break; } } } // 没有再次利用的颜色用新颜色 if (i >= colorVertex.size()) { colorNmuber++; String tmpStr = colorNextVertex.get(k); Vertex tmpVertex = vertexMap.get(tmpStr); tmpVertex.setVertexColor(colorNmuber); colorVertex.add(tmpVertex); colorNextVertex.remove(colorNextVertex.get(k)); colorNextVertex.addAll(tmpVertex.getNextPoint()); } } Collections.sort(colorNextVertex, new Comparator<String>() { public int compare(String arg0, String arg1) { Vertex Vertex0 = vertexMap.get(arg0); Vertex Vertex1 = vertexMap.get(arg1); return Vertex1.getNumber().compareTo(Vertex0.getNumber()); } }); StringBuffer sb = new StringBuffer("所需总颜色数为:" + colorNmuber); sb.append("\r\n"); for (int i = 0; i < colorVertex.size(); i++) { String resultStr = "点" + colorVertex.get(i).getNumber() + "着颜色" + colorVertex.get(i).getVertexColor(); sb.append(resultStr); if ((i + 1) % 5 == 0) { sb.append("\r\n"); } else { if (!(i == colorVertex.size() - 1)) { sb.append("---"); } } } write2File(sb.toString()); } public static void write2File(String result) { try { File file = new File(resultPath + "result.txt"); FileOutputStream os = new FileOutputStream(file); os.write(result.getBytes()); os.close(); } catch (Exception e) { e.printStackTrace(); } } }
算法使用java实现,具体的效果如图
需要源码和可执行文件包的到我的csdn去下载,地址:
http://download.csdn.net/detail/u013510614/9403562
相关文章推荐
- win7系统桌面快捷方式箭头删除
- LVS原理详解及部署之一:ARP原理准备
- dedecms 5.7 实现点击图片到下一页
- 删除Chrome地址栏自动补齐的某个URL
- leetcode283---Move Zeroes(把0移到数组后面)
- 注解@Transactional 不起作用的非配置问题
- 倒计时simple 天时分秒
- LVS原理详解及部署之三:手动部署LVS
- 测试人员如何阅读需求文档
- iOS中中文转字母,直接上代码
- 在Redhat下挂载windows的ntfs的方法
- Fiddler使用方式
- WebStrom编写CoffeeScript使用谷歌浏览器进行调试
- 深度学习-学习资料
- SimpleDateFormat 的使用注意点
- 关于动态批处理的一道题目
- iOS Dev (60) 怎样实现 UITextView 中的 placeHolder
- 根据产品原型结合主流程抽取类,属性以及关系
- [转]HTTP Header 详解
- Android实现带附件的邮件发送功能