算法介绍可以看我的数据结构专栏
import java.awt.print.Book;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Scanner;
class Main
{
public static void main(String[] args)
{
Scanner sc =new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
int[][] net=new int[n][n];
for (int i = 0; i < m; i++)
{
net[sc.nextInt()][sc.nextInt()]=sc.nextInt();
}
System.out.println(floyd(net,3));
}
//floyd
private static int floyd(int[][] net,int to)
{int n=net[0].length;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if(net[i][j]==0&&i!=j)
net[i][j]=10000000;
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
for (int j2 = 0; j2 < n; j2++)
{
net[j][j2]=Math.min(net[j][j2], net[j][i]+net[i][j2]);
}
}
}
return(net[0][to]);
}
//dijkstra
private static int extracted(int[][] net,int to)
{
int n=net[0].length;
boolean[] marked =new boolean[n];
int[]dis =new int[n];
//初始化
for (int i = 0; i < n; i++)
{
if(net[0][i]!=0) dis[i]=net[0][i];
else dis[i]=10000000;
}
for (int i = 0; i < n-1; i++)
{
int cur=minTar(dis,marked);
marked[cur]=true;
if(cur==to) break;
for (int j = 0; j < n; j++)
{
if(j!=cur&&net[cur][j]!=0&&dis[cur]+net[cur][j]<dis[j])
dis[j]=dis[cur]+net[cur][j];
}
}
return dis[to];
}
private static int minTar(int[] dis, boolean[] marked)
{
// TODO Auto-generated method stub
int ret=0;int min=dis[0];
for (int i = 0; i < dis.length; i++)
{
if(!marked[i]&&dis[i]<min)
{
min=dis[i];
ret=i;
}
}
return ret;
}
}