QingYi. 发表于 2021-1-3 09:37

【笔记】数据结构与算法之最短路算法(SPFA)

这是bellmanFord算法的优化版本,还是比较好用的
   

public class Main {
    private static int N= 1000010;    static int n,m;
    static int idx = 1;
    static int [] h = new int,ne = new int,e = new int, w = new int;
    // distance 距离
    static int [] dist = new int;
    static int INF= 0x3f3f3f3f;
    //statue判断当前的点是不是最终确定的最短点
    staticboolean [] st = new boolean;
    staticint [] arr = new int;
    public static void main(String[] args) throws IOException {
      BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
      String[] s = bf.readLine().split(" ");
//      n个点m条边
      n = Integer.parseInt(s);
      m = Integer.parseInt(s);
      Arrays.fill(h,-1);
      for (int i = 0; i < m; i++) {
            String []re = bf.readLine().split(" ");
            //分别是第一条边和第二条边
            int a = Integer.parseInt(re);
            int b = Integer.parseInt(re);
            //距离
            int c = Integer.parseInt(re);
            add(a,b,c);
      }
      int res = spfa();
      if (res==-1) {
            System.out.println("impossible");
      }else {
            System.out.println(res);
      }
    }


    static void add(int a, int b, int c){
      //当前的idx的element是b
      e = b;
      //当前的idx的权重是c
      w = c;
      //当前的idx的next是head
      ne = h;
      h = idx++;
    }

    private static int spfa() {
      Arrays.fill(dist,INF);
      dist = 0;
      Queue<Integer> queue = new LinkedList<>();
      queue.add(1);
      st = true;
//      int head = 0,tail = -1;
//      arr[++tail] = 1;
//      while (head<=tail){
//            int temp = arr;
//            st = false;
//            for (int i = h;i!=-1;i= ne){
//                int j = e;
//                if (dist>dist+w){
//                  dist = dist+w;
//                  if (!st){
//                        st = true;
//                        arr[++tail] = j;
//                  }
//                }
//            }
//      }

      while (!queue.isEmpty()){
            //弹出一个值 把这个值设置为不可用
            int temp = queue.poll();
            st = false;
            //i从弹出的值开始遍历
            for (int i = h;i!=-1;i= ne){
                int j = e;
                if (dist>dist+w){
                  dist = dist+w;
                  //如果j没用过,加入队列(加速)
                  if (!st){
                        st = true;
                        queue.add(j);
                  }
                }
            }

      }
      if (dist!=INF){
            return dist;
      }
      return -1;
    }

}


在新标签打开所有链接复制所有链接URL复制所有链接URL(反向)复制所有链接标题 + URL复制所有链接标题 + URL (MD)复制所有链接标题 + URL (BBS)复制所有链接标题 + URL (筛选)复制所有链接标题 + URL (设置复制格式)在新标签页打开所有图片链接在一个标签页显示所有图片链接
复选框 - 选中
复选框 - 取消
复选框 - 反选
单选框 - 选中
单选框 - 取消
特殊单选框 - 选中
在新标签打开所有链接复制所有链接URL复制所有链接URL(反向)复制所有链接标题 + URL复制所有链接标题 + URL (MD)复制所有链接标题 + URL (BBS)复制所有链接标题 + URL (筛选)复制所有链接标题 + URL (设置复制格式)在新标签页打开所有图片链接在一个标签页显示所有图片链接
复选框 - 选中
复选框 - 取消
复选框 - 反选
单选框 - 选中
单选框 - 取消
特殊单选框 - 选中

霏映 发表于 2021-1-3 09:54

学习一下

cqlk001 发表于 2021-1-3 10:01

谢谢分享 研究一下代码 :lol

amose 发表于 2021-1-3 21:44

站里Java的内容也太少了把

QingYi. 发表于 2021-1-3 22:14

amose 发表于 2021-1-3 21:44
站里Java的内容也太少了把

主要还是Python和易语言
页: [1]
查看完整版本: 【笔记】数据结构与算法之最短路算法(SPFA)