DS图应用--最短路径(含代码框架)

DS图应用–最短路径(含代码框架)
题目描述

给出一个图的邻接矩阵,再给出指定顶点v0,求顶点v0到其他顶点的最短路径

代码框架如下:

输入

第一行输入t,表示有t个测试实例

第二行输入n,表示第1个图有n个结点

第三行起,每行输入邻接矩阵的一行,以此类推输入n行

第i个结点与其他结点如果相连则为1,无连接则为0,数据之间用空格隔开

第四行输入v0,表示求v0到其他顶点的最短路径距离

以此类推输入下一个示例

输出

每行输出v0到某个顶点的最短距离和最短路径

每行格式:v0编号-其他顶点编号----[最短路径],具体请参考示范数据

样例查看模式
正常显示
查看格式
输入样例1 <-复制
1
5
0 5 0 7 15
0 0 5 0 0
0 0 0 0 1
0 0 2 0 0
0 0 0 0 0
0

输出样例1
0-1-5----[0 1 ]
0-2-9----[0 3 2 ]
0-3-7----[0 3 ]
0-4-10----[0 3 2 4 ]

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int n;int arr[100][100]={0};int dd;
int main(){
    int t;cin>>t;
    while (t--){
        cin>>n;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                cin>>arr[i][j];
            }
        }cin>>dd;
        int v[100]={0};int dis[100];vector<queue<int>>vq(n);
        for (int i = 0; i < n; ++i) {
            dis[i]=99;
        }
        v[dd]=1;dis[dd]=0;vq[dd].push(dd);

        int tt=100;
        while (tt--){
            for (int hang = 0; hang < n; ++hang) {if(v[hang]==0)continue;
                for (int shu = 0; shu < n; ++shu) {
                    if(arr[hang][shu]==0)continue;
                    if(dis[hang]+arr[hang][shu]<dis[shu]){
                        dis[shu]=dis[hang]+arr[hang][shu];
                        vq[shu]=vq[hang];vq[shu].push(shu);
                    }
                }int mindis=99;
                for (int k = 0; k < n; ++k) {
                    if(mindis>dis[k]&&v[k]!=1)mindis=k;
                }v[mindis]=1;
            }
        }
        for (int k = 0; k < n; ++k) {if(k==dd)continue;
            cout<<dd<<"-"<<k<<"-"<<dis[k]<<"----[";
            while (!vq[k].empty()){
                cout<<vq[k].front()<<" ";vq[k].pop();
            }cout<<"]"<<endl;
        }
    }

}
  • 理解成和dfs差不多一直WA。。。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: DS是一种有向,其中每个边都有一个权值。最短路径问题是指在中找到从一个起点到一个终点的最短路径。这个问题可以使用Dijkstra算法或Bellman-Ford算法来解决。Dijkstra算法是一种贪心算法,它从起点开始,每次选择距离起点最近的未访问节点,并更新与该节点相邻的节点的距离。Bellman-Ford算法则是一种动态规划算法,它通过多次迭代来更新每个节点的最短路径。这两种算法都可以解决最短路径问题,但是Dijkstra算法在处理稠密时更快,而Bellman-Ford算法可以处理带有负权边的。 ### 回答2: ds是一种数据结构,用于表示有向,并提供了一种最短路径的求解算法最短路径是指从起始点到目标点的一条最短的路径,其中路径的长度可以用一个数值来衡量,例如边的权值或者距离等。最短路径算法可以应用于很多领域,诸如导航、网络路由、路线规划等。 ds采用了多个数据结构来实现最短路径算法,包括堆、优先队列、散列表等。算法包括了三个主要步骤,分别是初始化、松弛和更新。 在初始化阶段,起始点被标记为距离为0,并加入到一个优先队列中。其他点被标记为无穷大距离,以便松弛算法能够更新它们。 在松弛阶段,算法会遍历优先队列中的点,并尝试更新它们的距离。具体地说,算法会遍历每个点的邻居,计算从起始点到邻居的距离,并将这个距离加上该点的距离值,然后比较新的距离值与当前距离值,如果新的更小,则更新距离值。 在更新阶段,算法会把被更新的点重新添加到优先队列中。这样,优先队列中的点会按照它们的距离值排序,从而保证算法能够找到最短路径。 总之,ds提供了一种快速、高效地求解最短路径算法。它的实现相对简单,但可以在实际应用中取得良好的效果。值得注意的是,算法假设中不存在负权边,否则算法可能不能正确地计算出最短路径。 ### 回答3: DS 是一种基于数据结构的,常用于图论算法的优化。在 DS 上求最短路径,与在原始上求最短路径的思路类似,都是利用一些经典算法来解决。但是 DS 可以优化的存储方式和查找过程,使得在某些的特征下,能够大大提高求解最短路径的效率。 DS 中,每个节点存储了该节点到一些固定“距离”范围内的节点的最短距离,相邻节点之间的边权重不一定相等。因此,在 DS 上求最短路径算法,需要结合这一特征进行设计。以下介绍两种常见的求最短路径算法: 1. Dijkstra 算法:该算法基于贪心算法的思想,每次选取与起点的距离最短的点作为下一步的起点,直到到达终点。但在 DS 上,由于节点之间的边权重不等,需要使用优先队列来动态维护每个节点的距离,再根据距离来确定下一个起点。时间复杂度为 O(ElogV),其中 E 为边数,V 为节点数。 2. A* 算法:该算法结合了 Dijkstra 算法和启发式搜索的思想,以终点为目标做启发式,每次扩展时都选取当前的最佳(启发式函数值最小)节点进行扩展。在 DS 中,启发式函数可以取当前节点到终点的距离,再乘以一个权重系数。通过启发式,能够使搜索效率更高,但前提是能够设计一个合适的启发式函数。时间复杂度也是 O(ElogV)。 总之,在 DS 上求最短路径与在普通上求最短路径算法思路类似,但需要结合 DS 的特征进行适当的改进。常用的算法有 Dijkstra 算法和 A* 算法。同样的,选择哪种算法,应该依据具体问题而定,考虑算法的时间复杂度、空间复杂度和实际应用中的效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值