美文网首页
[数据结构]求两点之间的最短路径 解题报告

[数据结构]求两点之间的最短路径 解题报告

作者: vouv | 来源:发表于2017-03-26 14:29 被阅读0次

Problem Description

最短路径问题是经典图论问题之一。从工程意义上讲,最短路径问题是对大量工程问题的直观抽象。
最典型的例子是在地图上寻找最短驾车路径。


shortshort

寻找从A到D的最短路径。


测试输入

5,7
A,B,C,E,D
<0,3,30>,<0,1,10>,<0,2,20>,<1,3,10>,<1,2,5>,<2,4,30>,<3,4,20>

测试输出

A-B-E-D

AcCode

//
//  main.cpp
//  求两点之间的最短路径
//
//  Created by jetviper on 2017/3/26.
//  Copyright © 2017年 jetviper. All rights reserved.
//

#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#define INFINITY 99999
int n,b,k,t;
struct{
    char name[10];
    int bnum;
    int linkto[5000];
    int value[5000];
}node[600];
char temp[5000],road[5000][5000];
int D[5000];
void scanfb(char *temp,int f,int *get){
    char s1[20],s2[20],s3[20];
    int p,s,c;
    int len = strlen(temp);
    if(temp[f]=='<'){
        p=0;
        for(int j=f+1;j<len;j++){
            if(temp[j]!=','){
                s1[p++]=temp[j];
            }
            else{
                s1[p]='\0';
                s=j;
                break;
            }
        }
        p=0;
        for(int j=s+1;j<len;j++){
            if(temp[j]!=','){
                s2[p++]=temp[j];
            }
            else{
                s2[p]='\0';
                c=j;
                break;
            }
        }
        p=0;
        for(int j=c+1,p=0;j<len;j++){
            if(temp[j]!=','){
                s3[p++]=temp[j];
            }
            else{
                s3[p]='\0';
                break;
            }
        }
    }
    get[0]=atoi(s1);
    get[1]=atoi(s2);
    get[2]=atoi(s3);
}


void Dij(int now){
    int list[500];
    int count=0;
    
    for(int i=0;i<node[now].bnum;i++){
        
        if(D[node[now].linkto[i]]>D[now]+node[now].value[i]){
            char tmpstr[500];
            strcpy(tmpstr,road[now]);
            strcat(tmpstr,node[now].name);
            strcat(tmpstr,"-");
            strcpy(road[node[now].linkto[i]],tmpstr);
            D[node[now].linkto[i]] = D[now] + node[now].value[i];
            list[count++] = node[now].linkto[i];
        }
    }
    for(int i=0;i<count;i++){
        Dij(list[i]);
    }
}



int main() {
    char str[500];
    int get[6];
    
    scanf("%d,%d",&n,&b);
    
    for(int i=0;i<n;i++){
        D[i]=INFINITY;
        node[i].bnum=0;
    }
    
    
    scanf("%s",str);
    k=0;
    int q=0;
    for(int i=0;i<strlen(str);i++){
        if(str[i]!=','){
            node[k].name[q++]=str[i];
        }
        else {
            node[k].name[q]='\0';
            k++;
            q=0;
        }
        
    }
    
    scanf("%s",temp);
    for(int i=0;i<strlen(temp);i++){
        if(temp[i]=='<'){
            scanfb(temp,i,get);
            node[get[0]].value[node[get[0]].bnum] = get[2];
            node[get[0]].linkto[node[get[0]].bnum++] = get[1];
        }
    }
    //startSearching
    
    D[0]=0;
    Dij(0);
    
    if(D[n-1]<INFINITY){
        
        printf("%s",road[n-1]);
        
        printf("%s\n",node[n-1].name);
    }
    
    return 0;
}

相关文章

  • [数据结构]求两点之间的最短路径 解题报告

    Problem Description 最短路径问题是经典图论问题之一。从工程意义上讲,最短路径问题是对大量工程问...

  • 最短路径

    无权图的最短路径用BFS来求 O(|V|+|E|) 有向带权图两点之间的最短路径也包含了路径上其他顶点间的最短路径...

  • 学习到底有没有捷径?

    首先,什么是捷径?捷径就是通往目标的最短路径。 我们都知道两点之间线段最短,也就是两点之间线段就是最短的路径。这么...

  • 5. Floyd算法

    Floyd算法 : 求图中任意一对顶点间的最短路径; 通常用方阵来表示图中每两点之间的最短路径的过程方阵的阶数越高...

  • 6.1 图的最短路径

    在网络中,求两个不同顶点之间的所有路径 中,边的权值之和最小的那一条路径 这条路径就是两点之间的最短路径(Shor...

  • 图论算法(二)广度优先搜索

    这是一种连通图的常用遍历策略,通常用于求起点到各点的最短路径,以及求两点之间的最优路径等问题。首先我们先来看看广度...

  • 图-最短路径问题

    在网络中,求两个不同顶点之间的所有路径中,边的权值之和最小的那一条路径 这条路径是两点之间的最短路径*第一个顶点为...

  • 时间管理的最短有效路径

    最短有效路径问题是「图论」研究中的一个经典演算法问题,旨在寻找图(由点和路径组成的)中两点之间的最短路径,以最短的...

  • 🚀 预售D55 资源32

    「不要寻找两点之间最短路径,要寻找阻力最小路径」 因为最短路径未必适合你 比如被客户无意中带进小区,一边浑身不自在...

  • 1/3毕业生半年内选择离职,第一份工作还是人生的决胜时刻吗?

    最近领英发布的《第一份工作趋势洞察》报告指出,当今职场发展的路径不再是两点之间直线最短的通途,而是曲折迂回的小径,...

网友评论

      本文标题:[数据结构]求两点之间的最短路径 解题报告

      本文链接:https://www.haomeiwen.com/subject/hhckottx.html