import java.util.LinkedList;
import java.util.List;
class Vertex{
public Vertex() {
this(null,0);
}
public Vertex(String n,int i) {
this.name = n;
this.id = i;
}
public int getId() {
return id;
}
public void setId(int i) {
this.id = i;
}
String name ;
int id;
boolean o=false;
}
public class Eulertour {
public Eulertour() {
this(null,0,0);
}
public Eulertour(List<Vertex>[] x,int n,int m) {
this.table = x;
this.n=n;
this.m =m;
tour = new LinkedList<>();
}
public void findEulerTour(Vertex v){
tour.clear();
tour.add(v);
count=1;
flag=0;
while(flag<tour.size()) {
if(!table[tour.get(flag).getId()].isEmpty()) {
count =flag+1;//count用来标记已经找到的路径中那个点需要进行下一个套图出发点
findEulerTour1(tour.get(flag));//flag用来不断在队列中推进寻找还有边的路径点
}
flag++;
}
}
private void findEulerTour1(Vertex x){//针对无向图
if(!table[x.getId()].isEmpty()) {//随机找一条边,终结点一定会绕回到出发点,并且出发点的边会遍历完毕
Vertex s=table[x.getId()].get(0);
table[x.getId()].remove(s);
table[s.getId()].remove(x);
tour.add(count, s);
count++;
findEulerTour1(s);
}
}
List<Vertex> tour ;//路径集合
List<Vertex>[] table ;//邻接表
int count=0;
int flag =0;
int m;
int n;
public static void main(String[] arg) {
LinkedList<Vertex> [] tab=new LinkedList[12];
for(int i=0;i<12;i++) {
tab[i]=new LinkedList<Vertex>();
}
Vertex v1=new Vertex("v"+1,0);
Vertex v2=new Vertex("v"+2,1);
Vertex v3=new Vertex("v"+3,2);
Vertex v4=new Vertex("v"+4,3);
Vertex v5=new Vertex("v"+5,4);
Vertex v6=new Vertex("v"+6,5);
Vertex v7=new Vertex("v"+7,6);
Vertex v8=new Vertex("v"+8,7);
Vertex v9=new Vertex("v"+9,8);
Vertex v10=new Vertex("v"+10,9);
Vertex v11=new Vertex("v"+11,10);
Vertex v12=new Vertex("v"+12,11);
tab[0].add(v3);tab[0].add(v4);
tab[1].add(v3);tab[1].add(v8);
tab[2].add(v1);tab[2].add(v2);tab[2].add(v4);tab[2].add(v6);tab[2].add(v7);tab[2].add(v9);
tab[3].add(v1);tab[3].add(v3);tab[3].add(v5);tab[3].add(v7);tab[3].add(v10);tab[3].add(v11);
tab[4].add(v4);tab[4].add(v10);
tab[5].add(v3);tab[5].add(v9);
tab[6].add(v3);tab[6].add(v4);tab[6].add(v9);tab[6].add(v10);
tab[7].add(v2);tab[7].add(v9);
tab[8].add(v3);tab[8].add(v6);tab[8].add(v7);tab[8].add(v8);tab[8].add(v10);tab[8].add(v12);
tab[9].add(v4);tab[9].add(v5);tab[9].add(v7);tab[9].add(v9);tab[9].add(v11);tab[9].add(v12);
tab[10].add(v4);tab[10].add(v10);
tab[11].add(v9);tab[11].add(v10);
Eulertour nEulertour=new Eulertour(tab,0,0);
nEulertour.findEulerTour(v1);
for(Vertex s:nEulertour.tour) {
System.out.print(s.name+"->");
}
}
}
所谓欧拉回路就是“一笔画”,这里采用的是DFS(套图法)
1 先找一个套图,利用tour表保存,每遍历一条边,就删除。
2 在tour中寻找仍有林捷变的结点
3 以上述结点再次循环查找套图