package ds; //图论算法 import java.util.LinkedList; import java.util.List; public class graph{ List<vertex> v=new LinkedList<vertex>(); int d[]=new int [8]; public void addvertex(int index){ v.add(new vertex(index, 0, false)); } public void addedge(int num,int index,int dist,boolean isvisit){ v.get(num-1).addedge(index, dist, isvisit); } public void bellman(){//最短路径的贝尔曼算法 int a[]=new int [v.size()+1]; //a[1]=0; for(int i=1;i<=v.size();i++){ a[i]=100000; } a[1]=0; for(int i=1;i<=v.size();i++){ for(int j=0;j<v.size();j++){ for(int k=0;k<v.get(j).l.size();k++){ if(a[v.get(j).index]+v.get(j).l.get(k).dist<a[v.get(j).l.get(k).index]){ a[v.get(j).l.get(k).index]= a[v.get(j).index]+v.get(j).l.get(k).dist; } } } } for(int i=1;i<=v.size();i++){ System.out.println(a[i]); } } public void dijsktra(){//最短路径的dijsktra算法 int a[]=new int[v.size()+1]; List <Integer>l=new LinkedList<Integer>(); for(int i=1;i<=v.size();i++){ l.add(i); a[i]=100000; } a[1]=0; int min,mark; while(true){ min=a[l.get(0)]; mark=l.get(0); for(int i=1;i<=l.size();i++){ if(a[v.get(i-1).index]<min){ min=a[l.get(i-1)]; mark=l.get(i-1); } } System.out.println(mark); l.remove((Integer)(mark)); for(int i=0;i<v.get(mark-1).l.size();i++){ if(a[mark]+v.get(mark-1).l.get(i).dist<a[v.get(mark-1).l.get(i).index]){ a[v.get(mark-1).l.get(i).index]=a[mark]+v.get(mark-1).l.get(i).dist; } } if(l.isEmpty()){ break; } } for(int i=1;i<=v.size();i++){ System.out.println(a[i]); } } public void DFS(int n,vertex ver){//图的深度优先搜索算法(递归实现) if(n==7){ return; } for(int i=0;i<ver.l.size();i++){ if(v.get(ver.l.get(i).index-1).isvisit==false){ v.get(ver.l.get(i).index-1).isvisit=true; System.out.println(v.get(ver.l.get(i).index-1).index); DFS(n+1,v.get(ver.l.get(i).index-1)); //v.get(ver.l.get(i).index-1).isvisit=false; } } } public void DFS2(){//图的深度优先搜索算法(非递归实现) //Stack<vertex> s=new Stack(); List <vertex> l=new LinkedList<vertex>(); vertex vt=v.get(0); while(!l.isEmpty()){ } } public void BFS(){//图的广度优先算法 List <Integer> l=new LinkedList<Integer>(); Integer temp; l.add(v.get(0).index); v.get(0).isvisit=true; while(!l.isEmpty()){ temp=l.get(0); System.out.println(temp); l.remove(0); for(int i=0;i<v.get(temp-1).l.size();i++){ if(v.get(v.get(temp-1).l.get(i).index-1).isvisit==false){ v.get(v.get(temp-1).l.get(i).index-1).isvisit=true; l.add(v.get(temp-1).l.get(i).index); } } } //l.add(e) } public void topsort(){//图的拓扑排序 int a[]=new int [v.size()+1];//存放每个边的度 List<Integer>l=new LinkedList<Integer>(); for(int i=0;i<v.size();i++){ for(int j=0;j<v.get(i).l.size();j++){ a[v.get(i).l.get(j).index]++; } } for(int i=1;i<=v.size();i++){ if(a[i]==0){ l.add(i); } } while(!l.isEmpty()){ int temp=l.get(0); System.out.println(temp); l.remove(0); for(int j=0;j<v.get(temp-1).l.size();j++){ a[v.get(temp-1).l.get(j).index]--; if(a[v.get(temp-1).l.get(j).index]==0){ l.add(v.get(temp-1).l.get(j).index); } } } } public static void main(String args[]){ graph g=new graph(); for(int i=1;i<=7;i++){ g.v.add(new vertex(i, 0, false)); } g.addedge(1, 2, 2, false); g.addedge(1, 4, 1, false); g.addedge(2, 4, 3, false); g.addedge(2, 5, 10, false); g.addedge(3, 1, 4, false); g.addedge(3, 6, 5, false); g.addedge(4, 3, 2, false); g.addedge(4, 6, 8, false); g.addedge(4, 7, 4, false); g.addedge(4, 5, 2, false); g.addedge(5, 7, 6, false); g.addedge(7, 6, 1, false); g.topsort(); //g.BFS(); //g.dijsktra(); //g.v.get(0).isvisit=true; //g.DFS(0, g.v.get(0)); //g.bellman(); //System.out.println(g.v.get(2).l.size()); } } class vertex{ List<vertex> l=new LinkedList<vertex>(); int index; int dist; boolean isvisit; public vertex(int index,int dist,boolean isvisit){ this.index=index; this.dist=dist; this.isvisit=isvisit; } public void addedge(int index,int dist,boolean isvisit){ l.add(new vertex(index,dist,isvisit)); } }