无向图染色问题

import java.io.*;
import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;
public class ranse {
private int V; // 顶点的数量(vertices)
private LinkedList adj[]; // 邻接表(Adjacency List)
// 构造方法
ranse(int v) {
V = v;
adj = new LinkedList[v];
for (int i = 0; i < v; ++i)
adj[i] = new LinkedList();
}
// 向图中加入边(Edge)
void addEdge(int v, int w) {
adj[v].add(w);
adj[w].add(v); // 无向图( undirected)
}
// 分配颜色 (从0号开始为所有的节点) 并且打印所有的颜色
void greedyColoring() {
int result[] = new int[V];
// 初始化所有未分配的顶点
Arrays.fill(result, -1);
// 为第一个顶点(vertex)分配第一种颜色
result[0] = 0;
//使用available数组存放所有可以分配的颜色. False
//available[cr]的值为false时,表示颜色cr可能已经分配给与它相邻的顶点了
boolean available[] = new boolean[V];
// 初始时,所有的颜色都可以使用
Arrays.fill(available, true);
// 为剩下的 V-1 顶点(vertices)分配颜色
for (int u = 1; u < V; u++) {
// 迭代处理所有的邻接点( adjacent vertices)并且标记他们的颜色为不可用( unavailable)
Iterator it = adj[u].iterator();
while (it.hasNext()) {
int i = it.next();
if (result[i] != -1)
available[result[i]] = false;
}
// 找到第一个可用的颜色( available color)
int cr;
for (cr = 0; cr < V; cr++) {
if (available[cr]){
break;
}
}
result[u] = cr; // 赋值
// 将所有的颜色值为 true并且开始下一次迭代(next iteration)
Arrays.fill(available, true);
}
// 输出结果
for (int u = 0; u < V; u++)
System.out.println(“Vertex " + u + " —> Color " + result[u]);
//计算颜色种类
int count = arraycount(result);
System.out.println(count);
}
int arraycount(int [] a) {
//计算一维数组的长度
int n = a.length;
//将数组拷贝到新的地址,这样对新数组操作不会改变原数组
int [] tmp = new int [n];
System.arraycopy(a, 0, tmp, 0, n);
//统计元素种类数
int Num = 1;
//将数组按元素大小重新排序
Arrays.sort(tmp);
for(int i = 1; i < n; i ++) {
if (tmp[i] != tmp[i-1]) {
Num ++;
}
}
return Num;
}
public static void main(String args[]) throws IOException {
String s;
int[][]save=new int[1000][1000];
try{
BufferedReader in =new BufferedReader(new FileReader(” “));
int i=0;
while((s=in.readLine())!=null){
String [] str = s.split(”\s+");
save[i][0]=Integer.parseInt(str[1]);
save[i][1]=Integer.parseInt(str[2]);
i++;
}
}
catch(FileNotFoundException e){
e.printStackTrace();
}
catch(IOException e){
e.printStackTrace();
}
for(int i=0;i<736;i++)
{
for(int j=0;j<2;j++){
System.out.print(save[i][j]);
System.out.print(" ");
}
System.out.println();
}
ranse g1 = new ranse(736);
for(int i = 0 ; i < 736; i++) {
g1.addEdge(save[i][0], save[i][1]);
}
System.out.println(“Coloring of graph 1”);
g1.greedyColoring();
}
}

你可能感兴趣的:(随便写写,java)