Bellman-Ford--解决负权边

解决负权边的算法

直接上代码

package 啊哈;
import java.util.Arrays;
import java.util.Scanner;

public class Bellman_ford解决负权边 {
    static int[] u=new int[10];//起点
    static int[] v=new int[10];//终点
    static int[] w=new int[10];//权值
    static int[] dis=new int[10];//单源最短路径数组
    static int n,m;
    static int inf=99999999;
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        m=sc.nextInt();
        Arrays.fill(u,0);
        Arrays.fill(v,0);
        Arrays.fill(w,0);
        Arrays.fill(dis,0);
        
        for(int i=1;i<=m;i++){
            u[i]=sc.nextInt();
            v[i]=sc.nextInt();
            w[i]=sc.nextInt();
        }
        
        for(int i=1;i<=n;i++)
            dis[i]=inf;
        
        dis[1]=0;//初始化
        //核心代码
        for(int k=1;k<=n-1;k++)    //源点本身不用更新,更新n-1轮,更新n-1个点    
            for(int i=1;i<=m;i++)遍历所有的边更新dis
                if(dis[v[i]]>dis[u[i]]+w[i])//比较源点到终点 与 源点到起点再到终点,其实就是松弛,和Floyd,Dijkstra都差不多
                    dis[v[i]]=dis[u[i]]+w[i];
                
        for(int i=1;i<=n;i++)
            System.out.print(dis[i]+" ");
        
    }

}

队列优化

package 啊哈;
import java.util.Arrays;
import java.util.Scanner;
import java.util.Queue;
import java.util.LinkedList;
public class Bellman_Ford队列优化 {
    static int[] u=new int[10];
    static int[] v=new int[10];
    static int[] w=new int[10];
    static int[] first=new int[10];
    static int[] next=new int[10];
    static int n,m;
    static Queue<Integer> q=new LinkedList<>();
    static boolean book[]=new boolean[10];
    static int[] dis=new int[10];
    static int inf=99999999;
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc=new Scanner(System.in);
        n=sc.nextInt();
        m=sc.nextInt();
        Arrays.fill(u,0);
        Arrays.fill(v,0);
        Arrays.fill(w,0);
        Arrays.fill(first,-1);
        Arrays.fill(next,0);
        Arrays.fill(dis,inf);
        for(int i=1;i<=m;i++){
            u[i]=sc.nextInt();
            v[i]=sc.nextInt();
            w[i]=sc.nextInt();
            next[i]=first[u[i]];
            first[u[i]]=i;
        }
        dis[1]=0;
        q.add(1);
        book[1]=true;
        int k;
        while(!q.isEmpty()){
            
            k=first[q.peek()];
            while(k!=-1){
                if(dis[v[k]]>dis[u[k]]+w[k]){
                    dis[v[k]]=dis[u[k]]+w[k];
                    if(book[v[k]]==false){
                        book[v[k]]=true;
                        q.add(v[k]);
                    }
                }
                k=next[k];
            }
            q.poll();
            
        }
        
        for(int i=1;i<=n;i++)
            System.out.print(dis[i]+" ");
        
    }

}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值