import java.util.Scanner; import java.util.Stack; public class Test2_5 { static int n; //城市的个数 static int m; //城市之间路线的条数 static int N=100; //城市的个数,可修改 static int INF=1000000; //初始化无穷大 static int[][] map=new int[N][N]; static int[] dist=new int[N]; static int[] p=new int[N]; static boolean[] flag=new boolean[N]; static void Dijkstra(int u) { for (int i=1;i<=n;i++) { dist[i]=map[u][i]; flag[i]=false; if (dist[i]==INF) p[i]=-1; else p[i]=u; } dist[u]=0; flag[u]=true; for (int i=1;i<=n;i++) { int temp=INF,t=u; for (int j=1;j<=n;j++) if (!flag[j]&&dist[j]<temp) { t=j; temp=dist[j]; } if (t==u) return; flag[t]=true; for (int j=1;j<=n;j++) { if (!flag[j]&&map[t][j]<INF) if (dist[j]>(dist[t]+map[t][j])) { dist[j]=dist[t]+map[t][j]; p[j]=t; } } } } static void findpath(int u) { int x; Stack<Integer> s=new Stack<Integer>(); System.out.println("源点为:"+u); for (int i=1;i<=n;i++) { x=p[i]; while (x!=-1) { s.push(x); x=p[x]; } System.out.print("源点到其他各项顶点最短路径为:"); while (!s.empty()) { System.out.print(s.peek()+"--"); s.pop(); } System.out.println(i+"; 最短距离为:"+dist[i]); } } public static void main(String[] args) { // TODO Auto-generated method stub int u,v,w,st; Scanner sc = new Scanner(System.in); System.out.println("请输入城市的个数:"); n = sc.nextInt(); System.out.println("请输入城市之间的路线的个数:"); m = sc.nextInt(); System.out.println("请输入城市之间的路线及距离:"); for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) { map[i][j]=INF; } while (m--!=0) { u=sc.nextInt(); v=sc.nextInt(); w=sc.nextInt(); map[u][v]=Math.min(map[u][v], w); } System.out.println("请输入小明所在位置:"); st=sc.nextInt(); Dijkstra(st); System.out.println("小明所在的位置:"+st); for (int i=1;i<=n;i++) { System.out.print("小明:"+st+" - "+"要去的位置:"+i); if(dist[i]==INF) System.out.println("sorry,无路可达"); else System.out.println(" 最短距离为:"+dist[i]); } findpath(st); } }
chapter 2-5 一场说走就走的旅行---最短路径
猜你喜欢
转载自blog.csdn.net/qq_36496351/article/details/80037701
今日推荐
周排行