求有向图中两点间所有路径

时间:2023-02-01 18:00:53
public class GraphPath {
//有向带权图。-1表示无路可通。自己到自己也是-1。其它表示权值。
    private static int[][] graph=
    {
        {-1,2,3,3},//表示 0点到0点不连通;0点到1点连通,权值2;0点到2点连通,权值3,0点到3点连通,权值3
        {-1,-1,-1,2},
        {-1,2,-1,3},
        {-1,-1,-1,-1}        
    };
    private static boolean[] hasFlag=new boolean[graph.length];
    //true-表示该结点已访问过。false-表示还没有访问过。
     
    private static ArrayList res=new ArrayList();
    //最后的所有的路径的结果。每一条路径的格式是如:0->2->1->3:7
     
    //求在图graph上源点s到目标点d之间所有的简单路径,并求出路径的和。    
    public static void getPaths(int s,int d,String path,int sum)
    {
        hasFlag[s]=true;//源点已访问过. 
      for(int i=0;i
      {
        if (graph[s][i]==-1 || hasFlag[i]){continue;}
        //若无路可通或已访问过,则找下一个结点。
 
        if(i==d)//若已找到一条路径
       
            res.add(path+"->"+d+":"+(sum+graph[s][i]));//加入结果。
            continue;
        }
        getPaths(i, d, path+"->"+i, sum+graph[s][i]);//继续找
        hasFlag[i]=false;        
      }//for(i)
    }
       
    public static void main(String[] args) {
        // TODO Auto-generated method stub
      getPaths(0, 3, ""+0, 0);//从源点:0 到目点:3,初始路径:"0" 初始和:0
      for(String e:res)//打印所有的结果
      {
          System.out.println(e);
      }
    }
}