chapter 2-5 一场说走就走的旅行---最短路径

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);

	}

}

猜你喜欢

转载自blog.csdn.net/qq_36496351/article/details/80037701
2-5