java模板系列之spfa-hdu2544

最优情况下,时间复杂度是km,k是一个很小的常数,不过现在的出题人,都喜欢随手卡spfa,时间复杂度最差会到nm
https://vjudge.net/problem/HDU-2544

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

import java.util.*;

public class Main {

    static List<v> a[];
    static int n,m;
    static int d[];
    static boolean v[];
    static int num[];

    static class v{
        int to,val;

        public v(int to, int val) {
            this.to = to;
            this.val = val;
        }
    }

    static void spfa(){
        Arrays.fill(d,1000000009);
        Arrays.fill(v,false);
        Arrays.fill(num,0);
        Queue<Integer> q = new ArrayDeque<Integer>();
        d[1] = 0;
        v[1] = true;
        q.add(1);
        while(q.size()!=0){
            int x = q.poll();
            v[x] = false;
            for(int i=0;i<a[x].size();i++){
                int newto = a[x].get(i).to;
                int newval = a[x].get(i).val;
                if(d[newto]>d[x]+newval){
                    d[newto]=d[x]+newval;
                    if(!v[newto]){
                        q.add(newto);
                        v[newto] = true;
                    }
                    num[newto]++;
                    if(num[newto]>=n){
                        System.out.println("负环");
                    }
                }
            }
        }

    }

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        while(input.hasNext()){
            n = input.nextInt();
            m = input.nextInt();
            d = new int[n+1];
            v = new boolean[n+1];
            num = new int[n+1];
            if(n == 0 && m == 0){
                break;
            }
            a = new List[n+1];
            for(int i=1;i<=n;i++){
                a[i] = new ArrayList<v>();
            }
            for(int i=0;i<m;i++){
                int from,to,val;
                from = input.nextInt();
                to = input.nextInt();
                val = input.nextInt();
                a[from].add(new v(to,val));
                a[to].add(new v(from,val));
            }
            spfa();
            System.out.println(d[n]);
        }
    }




}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值