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
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值