欧拉回路 深度优先搜索java实现

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 以上述结点再次循环查找套图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值