重返天梯-L3-014 周游世界 (30 分)(dfs)

题目描述

周游世界是件浪漫事,但规划旅行路线就不一定了…… 全世界有成千上万条航线、铁路线、大巴线,令人眼花缭乱。所以旅行社会选择部分运输公司组成联盟,每家公司提供一条线路,然后帮助客户规划由联盟内企业支持的旅行路线。本题就要求你帮旅行社实现一个自动规划路线的程序,使得对任何给定的起点和终点,可以找出最顺畅的路线。所谓“最顺畅”,首先是指中途经停站最少;如果经停站一样多,则取需要换乘线路次数最少的路线。
重返天梯-L3-014 周游世界 (30 分)

子问题拆解

维护双变量换乘输出

给定一个line[i][j],表示从i到j站点所乘坐的线路
path[]表示所经过的所有站点(其中有换乘)

请输出每条换乘线路的首尾结点?

算复杂也不算复杂的一个问题,需要想到维护两个变量preLine,preTrans
往后遍历路径,如果线路变化发生换乘,再进行输出

// 维护两个变量,记录线路编号和这条线路的首站
int preLine = 0, preTrans = start;
for (int j = 1; j < path.size(); j++) {
    if (preLine != line[path[j-1]][path[j]]) {
        if (preLine != 0) printf("take the bus%d from %d to %d\n", preLine, preTrans, path[j-1]);
        preLine = line[path[j-1]][path[j]];
        preTrans = path[j-1];
    }
}

排列型枚举 dfs 最顺畅路径

void dfs(int node, int ed, int cnt, int &minCnt, int &minTrans) {
    if (node == ed && (cnt < minCnt || (cnt == minCnt && calTrans(tempPath) < minTrans))) {
        minCnt = cnt;
        minTrans = calTrans(tempPath);
        path = tempPath;
    }
    
    if (node == ed) return;
    
    for (int i = 0; i < v[node].size(); i++) {
        if (!st[v[node][i]]) {
            st[v[node][i]] = true;
            tempPath.push_back(v[node][i]);
            dfs(v[node][i], ed, cnt+1, minCnt, minTrans);
            st[v[node][i]] = false; // 还原现场
            tempPath.pop_back();
        }
    }
}

C++

#include <iostream>
#include <cstring>
#include <vector>
#define debug(x) cout << #x << '=' << x << endl
using namespace std;
const int N = 10010;
int n;
vector<vector<int>> v(N);
int line[N][N]; // 存储站点间的线路
bool st[N];
vector<int> tempPath, path;

int calTrans(vector<int> a) {
    int cnt = 0, preLine = 0;
    for (int j = 1; j < a.size(); j++) {
        if (line[a[j-1]][a[j]] != preLine) cnt++;
        preLine = line[a[j-1]][a[j]];
    }
    cnt--;
    return cnt;
}


void dfs(int node, int ed, int cnt, int &minCnt, int &minTrans) {
    if (node == ed) {
        if (cnt < minCnt || (cnt == minCnt && calTrans(tempPath) < minTrans)) {
            minCnt = cnt;
            minTrans = calTrans(tempPath);
            path = tempPath;
        }
        return;
    }
    
    for (int i = 0; i < v[node].size(); i++) {
        if (!st[v[node][i]]) {
            st[v[node][i]] = true;
            tempPath.push_back(v[node][i]);
            dfs(v[node][i], ed, cnt+1, minCnt, minTrans);
            st[v[node][i]] = false; // 还原现场
            tempPath.pop_back();
        }
    }
}


int main() {
    scanf("%d", &n);
    
    for (int i = 1; i <= n; i++) {
        int m, pre;
        scanf("%d%d", &m, &pre);
        for (int j = 1; j < m; j++) {
            int temp;
            scanf("%d", &temp);
            v[pre].push_back(temp); // 该站点可以到哪些站点
            v[temp].push_back(pre);
            line[pre][temp] = i, line[temp][pre] = i; 
            pre = temp;
        }
    }
    
    int k;
    scanf("%d", &k);
    
    while (k--) {
        int a, b;
        scanf("%d%d", &a, &b);
        int minCnt = 1e7, minTrans = 1e7;
        tempPath.clear();
        tempPath.push_back(a);
        st[a] = true;
        dfs(a, b, 0, minCnt, minTrans);
        st[a] = false;
        
        if (minCnt == 1e7) {
            puts("Sorry, no line is available.");
            continue;
        }
        
        cout << minCnt << endl;
        int preLine = 0, preTrans = a;
        for (int j = 1; j < path.size(); j++) {
            if (line[path[j-1]][path[j]] != preLine) {
                if (preLine != 0) 
                    printf("Go by the line of company #%d from %04d to %04d.\n", preLine, preTrans, path[j-1]);
                preLine = line[path[j-1]][path[j]];
                preTrans = path[j-1];
            }
        }
        printf("Go by the line of company #%d from %04d to %04d.\n", preLine, preTrans, b);
        
    }
    
    return 0;
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 这个问题我可以回答。CVE-2019-16759漏洞是LibreOffice软件中的一个漏洞,攻击者可以利用该漏洞通过特制的ODF文档文件来执行任意代码。该漏洞的原理是由于LibreOffice在处理ODF文档时,没有正确地验证文档中的宏代码,导致攻击者可以通过恶意代码来执行任意命令。该漏洞已经被修复,建议用户及时更新软件版本。 ### 回答2: CVE-2019-16759是一个存在于某个软件或系统中的安全漏洞。该漏洞具体的原理是指某个软件或系统的设计或实现过程中存在的缺陷,使得攻击者可以利用这个缺陷来执行恶意操作。 对于CVE-2019-16759漏洞而言,具体的原理可以为以下几个方面进行解析。 首先,CVE-2019-16759漏洞可能涉及到软件或系统中的某个输入验证机制存在问题。在正常的运行过程中,软件或系统需要接受用户的输入,并对输入进行验证,以确保输入的合法性。然而,由于软件或系统在输入验证方面存在缺陷,攻击者可以发送恶意输入来绕过验证过程,从而导致安全漏洞的产生。 其次,CVE-2019-16759漏洞可能与某个安全控制机制的问题有关。安全控制机制是指软件或系统中用于限制用户权限和保护敏感数据的一系列规则和方法。然而,由于软件或系统在安全控制方面存在漏洞,攻击者可以绕过控制机制,获取未经授权的访问权限或窃取敏感数据。 第三,CVE-2019-16759漏洞可能涉及到软件或系统中的某个错误处理机制存在问题。在软件或系统的运行过程中,会出现各种错误和异常情况,需要有相应的处理机制来处理这些问题。然而,由于软件或系统在错误处理方面存在缺陷,攻击者可以利用这些错误和异常情况来执行恶意操作,进而导致安全漏洞的产生。 总之,CVE-2019-16759漏洞的原理可以归结为输入验证机制的问题、安全控制机制的问题和错误处理机制的问题等方面。攻击者可以利用这些缺陷来绕过验证、获取未经授权的权限或窃取敏感数据,从而导致软件或系统的安全性受到威胁。为了解决该漏洞,开发者或维护者需要修复相关的软件或系统,增强输入验证、安全控制和错误处理等方面的能力,确保软件或系统的安全性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeSlogan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值