Shortest Distamce(最短路径java)
有N个节点围成一个圈,相邻两个点之间的距离已知,且每次只能移动到相邻点。然后给出M个询问,每个询问给出两个数字A和B即节点编号(1<=A,B<=N),求从A号节点到B号节点的最短距离。
输入样例:
5 1 2 4 14 9
3
1 3
2 5
4 1
输出样例:
3
10
7
代码如下:
package 算法笔记;
import java.util.Scanner;
//Shortest Distamce(最短路径)
public class test0003 {
public static void main(String [] args)
{
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int []a=new int[n+1];
int sum=0;
int max=100005;
int dis[]=new int[max];
for(int i=1;i<=n;i++)
{
a[i]=sc.nextInt();
sum+=a[i];
dis[i]=sum;
}
int m=sc.nextInt();
int [] left=new int[m];
int [] right=new int[m];
//int [] temp=new int[m];
for(int i=0;i<m;i++)
{
left[i]=sc.nextInt();
right[i]=sc.nextInt();
}
for(int i=0;i<m;i++)
{
if(left[i]>right[i])
{
int t=0;
t=left[i];
left[i]=right[i];
right[i]=t;
}
int temp=dis[right[i]-1]-dis[left[i]-1];//逆序路径和
System.out.printf("%d\n",Math.min(temp, sum-temp));//判断顺序路径和较大还是逆序路径和较大
}
}
}
调试结果如下:
对于
int temp=dis[right[i]-1]-dis[left[i]-1];
System.out.printf("%d\n",Math.min(temp, sum-temp));
说明如下:
由于我们的操作本来就是个圆形操作,所以我们用sum来累加本次的所有路径和,然后在用temp保存我们需要求解的顺序路径和,若顺序路径和较大,就选择逆序路径和,若是逆向路径和(temp-sum)较大,那么就选择顺序路径和。