• 最短路径简析


    1.如果是无权图的最短路径可以使用DFS来求最短路径,比较方便,可以记录路径和距离,维护一些变量也较为方便。

    // s,end1分别是起点和终点
    tempath.push_back(s);
    void dfs(int node, int cnt){
        if(node==end1&&(cnt<mincnt)){ //判断是否到达了终点和是否更新路径
            ans=temppath;
            mincnt=cnt;
        }
        if(node==end1) return; //到达了终点就返回了
        for(int i=0; i<graph[node].size(); i++){
            if(visited[graph[node][i]]==0){ //判断节点是否访问过了 
                visited[graph[node][i]]=1; 
                temppath.push_back(graph[node][i]);
                dfs(graph[node][i], cnt+1);
                temppath.pop_back();
                visited[graph[node][i]]=0;
            }
        }       
    }
    

    PAT 列题参考:PAT 1131 Subway Map

    在求无权图的最短路径时也可以用层序遍历了,但用dfs似乎更顺手。

    2.在求无权图的最短路径时也可以用层序遍历了,但用dfs似乎更顺手。

    /* 邻接矩阵存储 - 有权图的单源最短路算法 */
    
    Vertex FindMinDist( MGraph Graph, int dist[], int collected[] )
    { /* 返回未被收录顶点中dist最小者 */
        Vertex MinV, V;
        int MinDist = INFINITY;
    
        for (V=0; V<Graph->Nv; V++) {
            if ( collected[V]==false && dist[V]<MinDist) {
                /* 若V未被收录,且dist[V]更小 */
                MinDist = dist[V]; /* 更新最小距离 */
                MinV = V; /* 更新对应顶点 */
            }
        }
        if (MinDist < INFINITY) /* 若找到最小dist */
            return MinV; /* 返回对应的顶点下标 */
        else return ERROR;  /* 若这样的顶点不存在,返回错误标记 */
    }
    
    bool Dijkstra( MGraph Graph, int dist[], int path[], Vertex S )
    {
        int collected[MaxVertexNum];
        Vertex V, W;
    
        /* 初始化:此处默认邻接矩阵中不存在的边用INFINITY表示 */
        for ( V=0; V<Graph->Nv; V++ ) {
            dist[V] = Graph->G[S][V];
            if ( dist[V]<INFINITY )
                path[V] = S;
            else
                path[V] = -1;
            collected[V] = false;
        }
        /* 先将起点收入集合 */
        dist[S] = 0;
        collected[S] = true;
    
        while (1) {
            /* V = 未被收录顶点中dist最小者 */
            V = FindMinDist( Graph, dist, collected );
            if ( V==ERROR ) /* 若这样的V不存在 */
                break;      /* 算法结束 */
            collected[V] = true;  /* 收录V */
            for( W=0; W<Graph->Nv; W++ ) /* 对图中的每个顶点W */
                /* 若W是V的邻接点并且未被收录 */
                if ( collected[W]==false && Graph->G[V][W]<INFINITY ) {
                    if ( Graph->G[V][W]<0 ) /* 若有负边 */
                        return false; /* 不能正确解决,返回错误标记 */
                    /* 若收录V使得dist[W]变小 */
                    if ( dist[V]+Graph->G[V][W] < dist[W] ) {
                        dist[W] = dist[V]+Graph->G[V][W]; /* 更新dist[W] */
                        path[W] = V; /* 更新S到W的路径 */
                    }
                }
        } /* while结束*/
        return true; /* 算法执行完毕,返回正确标记 */
    }
    

    PAT 列题参考:PAT 1111 Online Map

  • 相关阅读:
    commons-lang3工具类学习(三)
    commons-lang3工具类学习(二)
    commons-lang3工具类学习(一)
    Spring之ClassPathResource加载资源文件
    Spring详解(十)加载配置文件
    java IO流总结
    Spring自定义注解配置切面实现日志记录
    使用@Cacheable 踩过的坑
    将BufferedImage转换为InputStream,亲测可用
    计算两个日期之间间隔的天数
  • 原文地址:https://www.cnblogs.com/A-Little-Nut/p/9652356.html
Copyright © 2020-2023  润新知