记录--洛谷 P1294 高手去散步

如果想查看完整题目,请前往洛谷 P1294 高手去散步

题目描述

鳌头山上有 n n n 个观景点,观景点两两之间有游步道共 m m m 条。高手的那个它,不喜欢太刺激的过程,因此那些没有路的观景点高手是不会选择去的。另外,她也不喜欢去同一个观景点一次以上。而高手想让他们在一起的路程最长(观景时它不会理高手),已知高手的穿梭机可以让他们在任意一个观景点出发,也在任意一个观景点结束。

输入格式

第一行,两个用空格隔开的整数 n n n 、 m . m. m. 之后 m m m 行,为每条游步道的信息:两端观景点编号、长度。

输出格式

一个整数,表示他们最长相伴的路程。

思路

类似于一个有权无向图,多点找最短路径。具体的dfs思路已经写在代码注释里了。

C++完整代码

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
int ans = 0;//最大路径
int dist;//每次dfs后的路径
int n, m;
//maps[i][j]储存从i到j的距离长度。
vector<vector<int> > maps(25, vector<int>(25, 0));
//vis[i]:标记i景点是否到过
vector<int> vis(25, 0);

void dfs(int start) {
    vis[start] = 1;
    for(int i = 1;i <= n;i++) {
        if(maps[start][i] && vis[i] == 0) {
            dist += maps[start][i];
            vis[i] = 1;
            dfs(i);//从i点开始找下一个能到的点
            //从这里开始,就是从上一个dfs出来,说明i点之后已经没有可以到达的点了。
            //所以回到i点的上一个点,继续找可以到的点,所以将到i点的距离减掉
            dist -= maps[start][i];
        }
    }
    vis[start] = 0;
    ans = max(ans, dist);
    return ;
}

int main() {
 
    cin >> n >> m;
    for(int i = 1;i <= m;i++) {
        int x, y,len;
        cin >> x >> y >> len;
        maps[x][y] = len;
        maps[y][x] = len;
    }
    for(int i = 1;i <= n;i++) {
        dfs(i);
        //
    }
    cout << ans << endl;


    return 0;
}
相关推荐
Gigavision11 分钟前
基于BUAA-MIHR数据集的噪声解耦对比学习算法
人工智能·python·深度学习·算法
鹿角片ljp22 分钟前
LeetCode 64:最小路径和复盘|二维 DP 与 ACM 模式完整写法
java·数据结构·算法
彧azz2 小时前
算法设计与分析:贪心与动态规划
数据结构·学习·算法·贪心算法·动态规划
Beyond_System|系统之外2 小时前
【学编程】Python基础编程题100道(21-60)
开发语言·python·算法
漂流瓶jz4 小时前
UVA-1442 洞穴 题解答案代码 算法竞赛入门经典第二版
c++·算法·题解·aoapc·算法竞赛入门经典·uva
叠层归一研究院5 小时前
基于极限自指的叠层归一宇宙结构理论——无元外部封闭系统的内生区分模型
人工智能·经验分享·算法·agi
Selvaggia6 小时前
Diffusion Model 的基本原理与模型架构
算法
wabs6668 小时前
关于二叉树【力扣572.另一棵树的子树的思考】
数据结构·c++·算法·leetcode·二叉树
hanlin038 小时前
刷题笔记:力扣第41题-缺失的第一个正数
笔记·算法·leetcode
shehuiyuelaiyuehao8 小时前
算法50,分治归并,数组中的逆序对
java·算法