寻找无向图的最短路径(有跳数限制)

需要寻找一条有效的最短路径。给定一个无向网络G=(V,A,C),其中V是节点集合,A是无向边集合,C是边路径长度集合,对于每条边a(i,j),对应有c(i,j)>=0。当给定两节点(源点和汇点)以及跳数pathLength,求解两点之间的最短距离,要求其跳数满足大于pathLength。
要求:设计算法,分析其时间复杂度。请提供源程序。输入的测试数据如下所示:

7 12 2

0 1 2 3 4 5 6

0 4 74

1 4 60

2 4 60

3 4 97

5 0 100

5 1 100

5 2 100

5 3 100

6 0 100

6 1 100

6 2 100

6 3 100

数据说明如下:

第1行:7表示7个节点;12表示12条链路;2表示跳数pathLength。

第2行:0 1 2 3 4 56:表示有7个节点,节点标识为0,1,…,6。

第3-14行:表示边,如0 4 74表示节点0到节点4的边距离为74。

#include <iostream>
#include <unordered_map>
#define INF 2147483647
using namespace std;
unordered_map<int,int>nameToIndex;
unordered_map<int,int>indexToName;

int vexNum;
int edgeNum;
int pathLendth;
int vS;
int vD;//源点,目标点
int res[120];//保存被访问的路径节点 
int minL = INF;//最短路径 
int num;
int path[120];//前驱
int g[120][120];//领接矩阵存储边
int isVisited[120];//节点访问情况

void Dfs(int index,int sum) { //index为已访问的点个数,sum为总长
    if(sum>=minL) {
        return;//没找到更小的路径,直接退出
    } else if(path[index-1]==vD) { //找到了目标点
        if(index-1>pathLendth && sum<minL) { //满足跳数和最小
            for(int i = 0; i<index; i++) {
                res[i] = path[i];//将path数组复制 
            }
            minL = sum;
            num = index;
        }
        return;//结束
    } else {
        for(int i = 0; i<vexNum; i++) { //遍历点
            if(!isVisited[i] && g[path[index-1]][i]<INF) { //没被访问且有边
                path[index] = i;//将点i存储在path数组 
                isVisited[i] = 1;//i被访问
                Dfs(index+1,sum+g[path[index-1]][i]);//递归访问下一个
                isVisited[i] = 0;//回溯
            }
        }
    }
}

int main() {
    printf("请输入点数,边数,跳转数\n");
    scanf("%d %d %d",&vexNum,&edgeNum,&pathLendth);
    for(int i = 0; i<vexNum; i++) { //初试化边
        for(int j = 0; j<vexNum; j++) {
            g[i][j] = INF;
        }
    }
    printf("输入节点标识\n");
    int tmpName;
    int tmpIndex = 0;
    for(int i = 0; i<vexNum; i++) {
        scanf("%d",&tmpName);//读取点的值
        nameToIndex[tmpName] = tmpIndex;//记录值与数组下标的对应关系
        indexToName[tmpIndex] = tmpName;
        tmpIndex++;
    }

    int tmpV1;
    int tmpV2;
    int tmpL;
    printf("请输入点A,点B,边长\n");
    for(int i = 0; i<edgeNum; i++) {
        scanf("%d %d %d",&tmpV1,&tmpV2,&tmpL);
        tmpV1 = nameToIndex[tmpV1];
        tmpV2 = nameToIndex[tmpV2];
        g[tmpV1][tmpV2] = tmpL;//邻接矩阵存储边
        g[tmpV2][tmpV1] = tmpL;
    }
    for(int i = 0; i<vexNum; i++) {
        isVisited[i] = 0;//访问情况初始化
    }

    printf("源点,目标点\n");
    scanf("%d  %d",&vS,&vD);
    vS = nameToIndex[vS];//获取源点下标
    vD = nameToIndex[vD];//目标点下标

    isVisited[vS] = 1;
    path[0] = vS;//初始化
    Dfs(1,0);

    if(minL<INF) {
        printf("%d\n",minL);
        printf("路径为:");
        for(int i = 0; i<num; i++) {
            printf("%d   ",res[i]);
        }
    } else {
        printf("不存在\n");
    }
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容

  • 图的最短路径 迪杰斯特拉算法 贝尔曼-福特算法 弗洛伊德算法 SPFA算法(中国西南交通大学段凡丁发明) 最短路径...
    董泽平阅读 470评论 0 1
  • 前言 本专题旨在快速了解常见的数据结构和算法。 在需要使用到相应算法时,能够帮助你回忆出常用的实现方案并且知晓其优...
    蛮三刀酱阅读 3,381评论 0 0
  • 摘要 最短路径问题是一个在图论研究中很经典的问题,已经被应用到GIS、GPS等信息管理系统中,为人们生活带来了很大...
    你本无意穿堂风_a69c阅读 615评论 2 3
  • 摘要 最短路径问题是一个在图论研究中很经典的问题,已经被应用到GIS、GPS等信息管理系统中,为人们生活带来了很大...
    偏偏孤倨引山洪阅读 302评论 0 1
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,536评论 28 53