经典图着色算法作业

来源:互联网 发布:linux中解压zip文件 编辑:程序博客网 时间:2024/05/21 20:28

核心算法贴出来

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


0 0