7-1 最短路径之Floyd

请缩写程序,实现求有向网的最短路径的Floyd算法,因地点可能够是淡泊湖,宁静楼等等,这里简化成编号,要求能够查询出任意两点(用编号表示)间的最短路径及最小距离。

说明:1)顶点个数上限不超过100;2)距离权值上限不超过9998;
在这里插入图片描述
输入样例:
第一行,两个整数:vN和eN(图中顶点数和和边数)。
接下来是vN条边的信息:起点,终点,权值(三个数一行,以空格分隔);
最后两行是待查询的两组``起点与终点的编号(每行一个查询,起点与终点编号间也是空格分隔)。

6 8
0 5 100
0 2 10
0 4 30
1 2 5
2 3 50
3 5 10
4 3 20
4 5 60
0 5
2 0

(三块信息:顶点数和边数;边的信息;两组需要查询的顶点信息)

输出样例:
共输出三行,前两行分别输出两组查询的结果:先是起点到终点的路径说明,再是距离,中间以冒号分隔。如果两个点间不可达,输出距离-1。最后一行是整个可达距离中最大距离的描述(若有多组,输入位置稍前的一组,注意:不包括不可到达的无穷大)。

0->4->3->5:60
2->0:-1
1->2->3->5:65
0123456
00inf10inf30100inf
1inf05infinfinfinf
2infinf050infinfinf
3infinfinf0inf10inf
4infinfinf20060inf
5infinfinfinfinf0inf
6infinfinfinfinfinf0
0123456
00inf1060(0-2-3)3070(0-2-3-5)inf
1inf0555(1-2-3)inf65(1-2-3-5)inf
2infinf050infinfinf
3infinfinf0inf10inf
4infinfinf20060inf
5infinfinfinfinf0inf
6infinfinfinfinfinf0
import java.util.*;

class AdjMatrix{
    int vexnum,edgenum;
    int Matrix[][];
    int path[][];
  
    public AdjMatrix(int vexnum,int edgenum){
        this.vexnum=vexnum;
        this.edgenum=edgenum;
        Matrix=new int[vexnum][vexnum];
        path=new int[vexnum][vexnum];
      
        for(int i=0;i<vexnum;i++){
            for(int j=0;j<vexnum;j++){
                if(i==j)
                    Matrix[i][j]=0;
                else Matrix[i][j]=1000000;
                path[i][j]=j;
            }
        }
    }
    public void Print(int source,int end){
        int w=Matrix[source][end];
        int e=path[source][end];
        System.out.print(source);
        while(e!=end){
            System.out.print("->"+e);
            e=path[e][end];
        }
        System.out.print("->"+end);
        if(w==1000000)
            System.out.println(":-1");
        else System.out.println(":"+w);
    }
    public void floyd(){
        for(int k=0;k<vexnum;k++){
            for(int i=0;i<vexnum;i++){
                for(int j=0;j<vexnum;j++){
                    if(Matrix[i][j]>Matrix[i][k]+Matrix[k][j]){
                        Matrix[i][j]=Matrix[i][k]+Matrix[k][j];
                        path[i][j]=path[i][k];
                    }
                }
            }
        }
    }
    
}
public class Main{
    
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        AdjMatrix adjMatrix=new AdjMatrix(sc.nextInt(), sc.nextInt());
        for(int i=0;i<adjMatrix.edgenum;i++){
            adjMatrix.Matrix[sc.nextInt()][sc.nextInt()]=sc.nextInt();
        }    
        for(int x=0;x<2;x++){
            int s=sc.nextInt();
            int e=sc.nextInt();
            adjMatrix.floyd();
            adjMatrix.Print(s, e);
        }
        int max=0;
        int x=0;
        int y=0;
        for(int i=0;i<adjMatrix.vexnum;i++){
            for(int j=0;j<adjMatrix.vexnum;j++){
                if(adjMatrix.Matrix[i][j]==1000000)
                    continue;
                if(max<adjMatrix.Matrix[i][j]){
                    max=adjMatrix.Matrix[i][j];
                    x=i;
                    y=j;
                }
            }
        }
        adjMatrix.Print(x, y);

    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

能饮一杯吴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值