AcWing 853. 有边数限制的最短路
原题链接
简单
作者:
JAVA小老弟
,
2020-07-31 10:07:48
,
所有人可见
,
阅读 392
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.PriorityQueue;
// 存在负环 存在重边 求k条路径下 从1到n的最短距离
public class Main{
static int idx=0;
static int[] dis=new int[100100];
static int[] used=new int[100100];
static int[] h=new int[100100];
static Node[] q=new Node[100100];
static int n,m,k;
static int[] back=new int[100100];
public static void main(String[] args) throws IOException {
BufferedReader r=new BufferedReader(new InputStreamReader(System.in));
String s[]=r.readLine().split(" ");
n=Integer.parseInt(s[0]);
m=Integer.parseInt(s[1]);
k=Integer.parseInt(s[2]);
Arrays.fill(dis,0x3f3f3f3f);
dis[1]=0;
used[1]=1;
for (int i = 0; i <m ; i++) {
String line[]=r.readLine().split(" ");
int a=Integer.parseInt(line[0]);
int b=Integer.parseInt(line[1]);
int c=Integer.parseInt(line[2]);
add(a,b,c);
}
bull();
}
public static void add(int x,int y,int z)
{
q[idx++]=new Node(x,y,z);
}
public static void bull(){
for (int i = 0; i <k ; i++) {
//遍历k次 备份原数组 防止串联导致 结果不是k次的最短路径
back=Arrays.copyOf(dis,n+1);
for (int j = 0; j <idx ; j++) {
// 遍历每一对的关系进行更新操作
int a=q[j].x;
int b=q[j].y;
int c=q[j].z;
// 最短路径的选取 要和backup数组做对比
// 有没有可能出现重边 多次更新的现象 不可能 因为每次都是上次的backup数组做操作 而且限制了k次
if(dis[b]>back[a]+c)
dis[b]=back[a]+c;
}
}
// 由于存在负权重边 所以最后的距离结果为某个范围内我们都判定为impossible
if(dis[n]>0x3f3f3f3f/2)
System.out.println("impossible");
else
System.out.println(dis[n]);
}
}
class Node{
int x;
int y;
int z;
public Node(int x,int y,int z){
this.x=x;
this.y=y;
this.z=z;
}
}