旅游规划 Java

该博客主要展示了如何用Java实现Dijkstra算法,用于寻找给定图中两个节点间的最短路径。博主首先定义了图的邻接矩阵,并初始化了距离和价值数组,然后通过Dijkstra算法求解从源节点到目标节点的最短路径和价值。程序读取输入的图信息,包括节点数量、边的数量、源节点和目标节点,最后输出最短路径的总距离和总价值。
摘要由CSDN通过智能技术生成

编程语言:Java
题目:
在这里插入图片描述
题解:水题
结果:AC

import java.io.*;
import java.util.*;

public class Main {
    static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
    static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
    static Scanner sc = new Scanner(new BufferedInputStream(System.in));

    static int[][] graph=new int[500][500];
    static int[][] values=new int[500][500];
    static int[] dis=new int[500];
    static int[] value=new int[500];
    static boolean[] f=new boolean[500];
    static int n,s,d,m;

    public static void main(String[] args) throws IOException {
        in.nextToken();n= (int) in.nval;
        in.nextToken();m= (int) in.nval;
        in.nextToken();s= (int) in.nval;
        in.nextToken();d= (int) in.nval;
        for(int i=0;i<500;i++)
            Arrays.fill(graph[i], (int) 1e8);
        for(int i=0;i<500;i++)
            Arrays.fill(values[i], (int) 1e8);
        for(int i=0;i<m;i++){
            in.nextToken();int x1= (int) in.nval;
            in.nextToken();int x2= (int) in.nval;
            in.nextToken();int x3= (int) in.nval;
            in.nextToken();int x4= (int) in.nval;
            graph[x1][x2]=x3;
            values[x1][x2]=x4;
            graph[x2][x1]=x3;
            values[x2][x1]=x4;
        }
        dijkstra(s);
        out.println(dis[d]+" "+value[d]);
        out.flush();
    }

    private static void dijkstra(int s) {
        Arrays.fill(dis, (int) 1e8);
        Arrays.fill(value, (int) 1e8);
        dis[s]=0;
        value[s]=0;
        while(true){
            int v=-1;
            for(int u=0;u<n;u++){
                if(!f[u]&&(v==-1||dis[v]>dis[u]))
                    v=u;
            }
            if(v==-1)break;
            f[v]=true;
            for(int u=0;u<n;u++){
                if(!f[u]){
                    if(dis[u]>dis[v]+graph[v][u]){
                        dis[u]=dis[v]+graph[v][u];
                        value[u]=value[v]+values[v][u];
                    }else if(dis[u]==dis[v]+graph[v][u]&&value[u]>value[v]+values[v][u]){
                        value[u]=value[v]+values[v][u];
                    }
                }
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值