16蓝桥杯算法训练—最短路

package SuanFa_Train;

import java.util.Scanner;

/*
 最短路
问题描述
给定一个n个顶点,m条边的有向图(其中某些边权可能为负,但保证没有负环)。请你计算从1号点到其他点的最短路(顶点从1到n编号)。
输入格式
第一行两个整数n, m。
接下来的m行,每行有三个整数u, v, l,表示u到v有一条长度为l的边。


输出格式
共n-1行,第i行表示1号点到i+1号点的最短路。
样例输入
3 3
1 2 -1
2 3 -1
3 1 2
样例输出
-1
-2


数据规模与约定
对于10%的数据,n = 2,m = 2。
对于30%的数据,n <= 5,m <= 10。
对于100%的数据,1 <= n <= 20000,1 <= m <= 200000,-10000 <= l <= 10000,保证从任意顶点都能到达其他所有顶点。*/
public class Shortest_path {


public static void main(String[] args) 
{
//输入n、m
Scanner s1 = new Scanner(System.in);
Scanner s1_1 = new Scanner(s1.nextLine());
int num1[] = new int[2];
int len1=0;
while(s1_1.hasNext())
{
num1[len1] = s1_1.nextInt();
len1++;
}

int n = num1[0];
int m = num1[1];

int arr[][] = new int[m][3];
for(int i=0; i<m; i++)
{
//输入u,v,l
Scanner s2 = new Scanner(System.in);
Scanner s2_2 = new Scanner(s2.nextLine());
int num2[] = new int[3];
int len2 = 0;
while(s2_2.hasNext())
{
num2[len2] = s2_2.nextInt();
len2++;
}
arr[i][0] = num2[0];
arr[i][1] = num2[1];
arr[i][2] = num2[2];
}


//计算最短路劲
//正方向权值记和
int qz[] = new int[m];
int qz_len = 0;
for(int i=0; i<arr.length; i++)
{
for(int j=0; j<arr[i].length; j++)
{
if(j==2)
{
if(qz_len==0)
{
qz[qz_len] = arr[i][j];
qz_len++;
}else{
qz[qz_len] = qz[qz_len-1] + arr[i][j];
qz_len++;
}
}
}
}

//负方向权值记和
int qz1[] = new int[m];
int qz_len1 = 0;
for(int i=arr.length-1; i>=0; i--)
{
for(int j=arr[i].length-1; j>=0; j--)
{
if(j==2)
{
if(qz_len1==0)
{
qz1[qz_len1] = arr[i][j];
qz_len1++;
}else{
qz1[qz_len1] = qz1[qz_len1-1] + arr[i][j];
qz_len1++;
}
}
}
}

// 输出测试
// for(int i=0; i<qz.length;i++)
// {
// System.out.print(qz[i]+" ");
// }
// System.out.println();
// for(int i=0; i<qz.length;i++)
// {
// System.out.print(qz1[i]+" ");
// }

// 将两数组比较,小的为最小路劲
for(int i=0; i<qz.length-1;i++)
{
if(qz[i] < qz1[qz.length-2-i])
System.out.println(qz[i]);
else
System.out.println(qz1[qz.length-2-i]);
}
}


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值