最短路问题

2478: 最短路问题

Time Limit: 5000MS Memory Limit: 65536KB
Total Submit: 16 Accepted: 3 Page View: 402
Submit  Status  Discuss
现在有n个城市,编号从1到n。现在已知从城市i到城市j需要走的时间为aij。M78要从城市1到城市n。M78有一个飞行符,飞行符可以使得他瞬间通过一条边或连续的两条边(连续走一条边或两条边的时间为0)。问,M78从城市1到城市n,最少花费的时间。
多组输入。每组第一行有一个整数n,表示城市的数目。(2<=n<=1000)
接下来将输入一个n*n的矩阵。矩阵第i行第j列的数字aij表示从城市i到城市j,花费的时间为aij。(0<=aij<=10000 , aii=0 ,aij=aji)。如果aij=0,表示没有这条路。
每组输出一个数字,表示M78从城市1到城市n花费的最少时间。特别的,如果M78到不到了城市n,输出-1。
3
0 1 1
1 0 1
1 1 0

题中把图的构造直接告诉我们了,所以只需要用数组存起来直接用Floyd算法,就可以求得最短路径,不过之前我写错的地方是没注意到应该双向赋值。

#include <iostream>
#include<cstring>
#include<cstdio>
#define INF 9999999


using namespace std;
int main()
{
    int n,m,a,b,w[105][105],len;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(n==0||m==0)
            break;
        else
        {
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
                    w[i][j]=(i==j?0:INF);
            for(int i=1;i<=m;i++)
            {
                scanf("%d%d%d",&a,&b,&len);
                if(a != b && w[a][b] > len)
                    {
                        w[a][b]=len;
                        w[b][a]=len;                                   //双向赋值
                    }
            }
            for(int k=1;k<=n;k++)                            //Floyd模板
            for(int i=1;i<=n;i++)
                for(int j=1;j<=n;j++)
            {
                if(w[i][j]>w[i][k]+w[k][j])
                    w[i][j]=w[i][k]+w[k][j];
            }
            printf("%d\n",w[1][n]);
        }
    }
    return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Matlab解决最短路问题的示例代码: ```matlab % 首先定义图的邻接矩阵 % 例如下面的邻接矩阵表示一个6个节点的有向图 % 从1到2的边权重为2,从1到3的边权重为4,以此类推 % 如果两个节点之间没有边相连,则边权重为inf G = [0 2 4 inf inf inf; inf 0 1 5 inf inf; inf inf 0 1 inf inf; inf inf inf 0 3 inf; inf inf inf inf 0 2; inf inf inf inf inf 0]; % 使用Dijkstra算法计算从节点1到其他节点的最短路径和距离 [start_node, dist] = dijkstra(G, 1); % 打印结果 fprintf('从节点1到其他节点的最短路径和距离如下:\n'); for i = 1:length(dist) fprintf('从节点1到节点%d的最短路径为:', i); print_path(start_node, i); fprintf(',距离为:%d\n', dist(i)); end % Dijkstra算法实现 function [start_node, dist] = dijkstra(G, s) n = size(G, 1); start_node = zeros(1, n); dist = inf(1, n); visited = false(1, n); dist(s) = 0; for i = 1:n-1 u = find_min_dist(dist, visited); visited(u) = true; for v = 1:n if ~visited(v) && G(u,v) ~= inf && dist(u) + G(u,v) < dist(v) dist(v) = dist(u) + G(u,v); start_node(v) = u; end end end end % 辅助函数:找到距离源节点最近的未访问节点 function u = find_min_dist(dist, visited) dist(visited) = inf; [~, u] = min(dist); end % 辅助函数:打印路径 function print_path(start_node, v) if start_node(v) == 0 fprintf('%d', v); else print_path(start_node, start_node(v)); fprintf(' -> %d', v); end end ``` 希望这个示例代码能够帮助您解决最短路问题

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值