题意:给定一个图,以及起点和终点,需要我们计算两条路径。第1条路径:距离最短路径,若不唯一,则选择用时最短的那一条;第2条路径:用时最少路径,若不唯一,选择经过结点数最少的那一条。

思路:两次Dijkstra即可。以往都是求一条路径,本题要求两条,没什么不同,只是代码量多了一些。编写代码前要心中有数,变量名怎么命名等等(变量名一多,命名真是件举棋不定的事。。)

第1条路径:第1标尺为距离,第2标尺为用时,在Dijkstra中完成更新。用pre[v]记录结点v的前驱,在Dijkstra之后用DFS把路径提取出来即可。

第2条路径:第1标尺为用时,第2标尺为整条路径所经过的结点数,也可以在Dijkstra中完成更新。其他操作都是一模一样的。

#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;

const int Inf=0x7fffffff;
;
struct Node{
    int v;
    int length,time;
    Node(int v_,int len_,int t_):v(v_),length(len_),time(t_){}
};
int n,m,s,e;//结点个数,边数,起点,终点
vector<Node> Adj[N];
bool vis[N];
vector<int> pre[N];
//dis[v]记录起点s到结点v的最短距离(第1标尺),cost[v]记录起点s到结点v的最快时间(第2标尺)
int dis[N];
int cost[N];
//time[v]记录起点s到结点v的最快时间(第1标尺),num[v]记录起点s到结点v的最少结点数(第2标尺)
int time[N];
int num[N];

void Dijkstra_length(int s)
{
    fill(vis,vis+N,false);
    fill(dis,dis+N,Inf);
    dis[s]=;
    fill(cost,cost+N,Inf);
    cost[s]=;

    ;i<n;i++){
        ,min=Inf;
        ;v<n;v++){
            if(!vis[v] && dis[v]<min){
                min=dis[v];
                u=v;
            }
        }
        ) return;
        vis[u]=true;

        for(auto node:Adj[u]){//u-v
            int v=node.v, len=node.length, time=node.time;
            if(!vis[v]){
                if(dis[u]+len < dis[v]){
                    dis[v] = dis[u]+len;
                    cost[v] = cost[u]+time;
                    pre[v].clear();
                    pre[v].push_back(u);
                }else if(dis[u]+len == dis[v] && cost[u]+time < cost[v]){
                    cost[v] = cost[u]+time;
                    pre[v].clear();
                    pre[v].push_back(u);
                }
            }
        }
    }
}

void Dijkstra_time(int s)
{
    fill(vis,vis+N,false);
    fill(time,time+N,Inf);
    time[s]=;
    fill(num,num+N,Inf);
    num[s]=;

    ;i<n;i++){
        ,min=Inf;
        ;v<n;v++){
            if(!vis[v] && time[v]<min){
                min=time[v];
                u=v;
            }
        }
        ) return;
        vis[u]=true;

        for(auto node:Adj[u]){//u-v
            int v=node.v, len=node.length, t=node.time;
            if(!vis[v]){
                if(time[u]+t < time[v]){
                    time[v] = time[u]+t;
                    num[v]=num[u]+;
                    pre[v].clear();
                    pre[v].push_back(u);
                } < num[v]){
                    num[v]=num[u]+;
                    pre[v].clear();
                    pre[v].push_back(u);
                }
            }
        }
    }
}
//用于提取路径
void dfs(int v,vector<int>& path)
{
    path.push_back(v);
    for(auto u:pre[v])
        dfs(u,path);
}

int main()
{
    //freopen("pat.txt","r",stdin);
    int v1,v2,one_way,len,t;
    scanf("%d%d",&n,&m);
    ;i<m;i++){
        scanf("%d%d%d%d%d",&v1,&v2,&one_way,&len,&t);
        if(one_way){
            Adj[v1].push_back(Node(v2,len,t));
        }else{
            Adj[v1].push_back(Node(v2,len,t));
            Adj[v2].push_back(Node(v1,len,t));
        }
    }
    scanf("%d%d",&s,&e);

    vector<int> path_len,path_time;//分别记录两条路径
    Dijkstra_length(s);
    dfs(e,path_len);
    Dijkstra_time(s);
    dfs(e,path_time);

    if(path_len==path_time){
        printf("Distance = %d; Time = %d:",dis[e],time[e]);
        ;i>=;i--){
            printf(" %d",path_time[i]);
            ) printf(" ->");
            else printf("\n");
        }
    }else{
        printf("Distance = %d:",dis[e]);
        ;i>=;i--){
            printf(" %d",path_len[i]);
            ) printf(" ->");
            else printf("\n");
        }
        printf("Time = %d:",time[e]);
        ;i>=;i--){
            printf(" %d",path_time[i]);
            ) printf(" ->");
            else printf("\n");
        }
    }
    ;
}

1111 Online Map的更多相关文章

  1. 1111 Online Map (30 分)

    1111. Online Map (30)Input our current position and a destination, an online map can recommend sever ...

  2. 1111 Online Map (30 分)

    1111 Online Map (30 分) Input our current position and a destination, an online map can recommend sev ...

  3. PAT甲级1111. Online Map

    PAT甲级1111. Online Map 题意: 输入我们当前的位置和目的地,一个在线地图可以推荐几条路径.现在你的工作是向你的用户推荐两条路径:一条是最短的,另一条是最快的.确保任何请求存在路径. ...

  4. PAT 1111 Online Map[Dijkstra][dfs]

    1111 Online Map(30 分) Input our current position and a destination, an online map can recommend seve ...

  5. PAT甲级——1111 Online Map (单源最短路经的Dijkstra算法、priority_queue的使用)

    本文章同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/90041078   1111 Online Map (30 分) ...

  6. PAT (Advanced Level) 1111. Online Map (30)

    预处理出最短路再进行暴力dfs求答案会比较好.直接dfs效率太低. #include<cstdio> #include<cstring> #include<cmath&g ...

  7. 1111. Online Map (30)

    Input our current position and a destination, an online map can recommend several paths. Now your jo ...

  8. 1111 Online Map (30)(30 分)

    Input our current position and a destination, an online map can recommend several paths. Now your jo ...

  9. PAT 1111 Online Map

    Input our current position and a destination, an online map can recommend several paths. Now your jo ...

  10. PAT Advanced 1111 Online Map (30) [Dijkstra算法 + DFS]

    题目 Input our current position and a destination, an online map can recommend several paths. Now your ...

随机推荐

  1. Node.js基础知识普及

    Node.js只支持单线程,故不会产生死锁,采用非阻塞I/O机制和事件环机制.非常适合与开发需要处理大量并发的输入/输出的应用程序.   一. Node.js的核心模块有很多,这里先写几个比较常用的( ...

  2. 为啥YII2 会出现 mcrypt_generic_init(): Key size is 0

    解决方案如下: (关键) 示例代码中,加密解密类的实例创见通过 Class 同名方法 的方式创建. public function WXBizMsgCrypt($token, $encodingAes ...

  3. python中sorted()函数的用法

    一. 定义 sorted()函数对所有可迭代的对象进行排序操作 二. 语法 sorted(iterable [, key[, reverse]]]) iterable:可迭代对象 key:主要是用来进 ...

  4. 【lightoj-1026】Critical Links(桥)

    题意: 给出无向图,求桥的模板题. #include <bits/stdc++.h> using namespace std; ; int dfn[N], low[N];//时间戳;low ...

  5. shell编程实例2

    1.vim  read_PERSON.sh 2. #!/bin/bash echo "What is your name?" read PERSON echo "Hell ...

  6. requests beautifulsoup

    requests Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但是,它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作, ...

  7. 20165210 Java第四次实验报告

    20165210 实验四 Android程序设计 实验步骤 第24章:初识Android 任务一:完成Hello World, 要求修改res目录中的内容,Hello World后要显示自己的学号 学 ...

  8. Android系统代码查询命令集合

    Android系统代码查询命令集合 *#06# 显示MEID *#*#4636#*#* 显示版本,或更新相机韧体 *#*#7594#*#* 当长按关机按钮时,会出现一个切换手机部分设置及更改设定 WL ...

  9. vue中使用axios发送请求

    我们知道,vue2.0以后,vue就不再对vue-resource进行更新,而是推荐axios,而大型项目都会使用 Vuex 来管理数据,所以这篇博客将结合两者来发送请求 1.安装axios cnpm ...

  10. HihoCoder1127 二分图三·二分图最小点覆盖和最大独立集

    二分图三·二分图最小点覆盖和最大独立集 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在上次安排完相亲之后又过了挺长时间,大家好像都差不多见过面了.不过相亲这个事不是说 ...