package com.data.struct; import java.util.ArrayList; import java.util.List; import java.util.Random; import com.data.struct.GraphicDepthFirst.Node; public class GraphicDepthFirstSort { private Node[] list; private int time=0; private List<Node> sortList=new ArrayList<Node>(); public GraphicDepthFirstSort(int v,int e){ list=new Node[v]; for(int i=0;i<v;i++){ Node node=new Node(); node.id=i; list[i]=node; } for(int i=0;i<e;i++){ int v1=new Random().nextInt(v); int v2=new Random().nextInt(v); if(v1==v2){ continue; } while(true){ Node node=list[v1]; boolean already=false; while(node.next!=null){ if(node.next.id==v2){ already=true; break; } node=node.next; } if(already==true){ break; } Node ex=new Node(); ex.id=v2; node.next=ex; break; } } } public List<Node> getSort(){ return sortList; } public void printSort(){ System.out.println("sort==========="); for(int i=0;i<sortList.size();i++){ System.out.print(sortList.get(i).id+" ");; } System.out.println(); } public void depthFirstSearch(){ for(int i=0;i<list.length;i++){ if(list[i].color==Node.WHITE){ dfsVisit(list[i]); } } } private void dfsVisit(Node node){ time++; node.d=time; node.color=Node.GRAY; Node w=list[node.id]; Node u=w; while(w.next!=null){ if(list[w.next.id].color==Node.WHITE){ list[w.next.id].color=Node.GRAY; list[w.next.id].parent=u; dfsVisit(list[w.next.id]); } w=w.next; } node.color=Node.BLACK; time++; node.f=time; sortList.add(0, node); } public void printDepth(Node v){ Node s=list[0]; if(v==s){ System.out.print(s.id+"=>"); }else if(v.parent==null){ System.out.print(v.id+"=>"); }else { printDepth(v.parent); System.out.print(v.id+"=>"); } } public void print(){ for(int i=0;i<list.length;i++){ Node node=list[i]; System.out.print(node.id+"=>"); while(node.next!=null){ System.out.print(node.next.id+"=>"); node=node.next; } System.out.println(); } } public void printAllDepth(){ System.out.println("path"); for(int i=0;i<list.length;i++){ printDepth(list[i]); System.out.println(); } } public static class Node{ public static final int WHITE=1; public static final int BLACK=2; public static final int GRAY=3; private int id; private Node next; private int color=WHITE; private int d=Integer.MAX_VALUE; private Node parent; private int f; } public static void main(String[] args)throws Exception { GraphicDepthFirstSort g=new GraphicDepthFirstSort(5,30); g.print(); g.depthFirstSearch(); g.printAllDepth(); g.printSort(); } }
上面构造的图,并不是有向无环图,但结果如果把它当作有向无环图,结果是正确的。