您的位置:首页 > 其它

经典图着色算法作业

2016-01-14 11:33 204 查看
核心算法贴出来

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: