AcWing 851. spfa求最短路
原题链接
简单
作者:
熬夜波比
,
2020-09-03 23:00:21
,
所有人可见
,
阅读 342
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int n;
static int m;
static int[] dist = new int[100010];
static boolean[] st = new boolean[100010];
static int _max=1_000_000_000;
static int[] e=new int[100010];
static int[] w=new int[100010];
static int[] ne=new int[100010];
static int[] h=new int[100010];
static int idx;
static void add(int a,int b,int c){
e[idx]=b;
w[idx]=c;
ne[idx]=h[a];
h[a]=idx++;
}
public static void main(String[] args) throws IOException {
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
m=sc.nextInt();
for(int i=0;i<=n+3;i++)
h[i]=-1;
while(m-->0){
int a=sc.nextInt();
int b=sc.nextInt();
int w=sc.nextInt();
add(a,b,w);
}
// System.out.println(dijkstra());
int t=spfa();
if(t== -1){
System.out.println("impossible");
}else{
System.out.println(t);
}
return;
}
static int spfa(){
for(int i=0;i<=n;i++){
dist[i]=_max;
}
dist[1]=0;
Queue<Integer> queue=new LinkedList();
queue.offer(1);
st[1]=true;
while(queue.size()>0){
int t=queue.poll();
st[t]=false;
for(int i=h[t];i!=-1;i=ne[i]){
int j=e[i];
if(dist[j]>dist[t]+w[i]){
dist[j]=dist[t]+w[i];
if(!st[j]){
queue.offer(j);
st[j]=true;
}
}
}
}
if(dist[n]>_max/2){
return -1;
}
return dist[n];
}
// static int bellman_ford(){
// dist[1]=0;
// for(int i=2;i<=n;i++) {
// dist[i]=_max;
// }
// for(int i=1;i<=k;i++){
// backup=dist.clone();
// //让所有距离为1的节点入队
// for(int j=0;j<allEdge.size();j++){
// int a=allEdge.get(j).a;
// int b=allEdge.get(j).b;
// int w=allEdge.get(j).w;
// dist[b]=Math.min(dist[b],backup[a]+w);
// }
// }
// if(dist[n]>_max/2){
// return -1;
// }
// return dist[n];
// }
}