private boolean hasEulerLoop(){
CC cc =newCC(G);if(cc.count()>1)returnfalse;for(int v =0; v < G.V(); v ++)if(G.degree(v)%2==1)returnfalse;returntrue;}
3 Hierholzer算法详解
public ArrayList<Integer>result(){
ArrayList<Integer> res = new ArrayList<>();if(!hasEulerLoop())return res;//根据小g进行删边
Graph g =(Graph)G.clone();
Stack<Integer> stack = new Stack<>();int curv =0;//出发点
stack.push(curv);while(!stack.isEmpty()){
if(g.degree(curv)!=0){
stack.push(curv);int w = g.adj(curv).iterator().next();
g.removeEdge(curv, w);
curv = w;}else{
res.add(curv);
curv = stack.pop();}}return res;}
4 Hierholzer算法实现
4.1 修改Graph,增加API
//移除边
public voidremoveEdge(int v,int w){
validateVertex(v);validateVertex(w);if(adj[v].contains(w)) E --;
adj[v].remove(w);
adj[w].remove(v);}//深拷贝
@Override
public Object clone(){
try{
Graph cloned =(Graph) super.clone();
cloned.adj = new TreeSet[V];for(int v =0; v < V; v ++){
cloned.adj[v]= new TreeSet<Integer>();for(int w: adj[v])
cloned.adj<