一道题两种解法:深度优先搜索、广度优先搜索-AtCode ABC204 C - Tour

从Podfile到分享成功:ShareSDK小红书模块集成全流程实战(附视频分享代码) 本文详细介绍了iOS应用如何通过ShareSDK集成小红书分享功能的全流程,包括环境配置、SDK初始化、图片和视频分享实现,以及常见问题排查和性能优化策略。特别针对视频分享这一高频需求场景,提供了完整的代码示例和实战技巧,帮助开发者快速实现社交分享功能。 阅读详情

标签

  • DFS、BFS

题目地址

C - Tour

  • https://atcoder.jp/contests/abc204/editorial/1991

問題描述

The republic of AtCoder has N cities numbered 1 through N and Mroads numbered 1 through M.

Road i leads from City Ai_ii​ to City Bi_ii​, but you cannot use it to get from City Bi_ii​ to City Ai_ii​.

Puma is planning her journey where she starts at some city, travels along zero or more roads, and finishes at some city.

How many pairs of cities can be the origin and destination of Puma’s journey? We distinguish pairs with the same set of cities in different orders.

Constraints

  • 2 ≤\leq≤ N ≤\leq≤ 2000
  • 0 ≤\leq≤ M ≤\leq≤ min⁡\minmin(2000,N(N-1))
  • 1 ≤\leq≤ Ai_ii​,Bi_ii​ ≤\leq≤ N
  • Ai_ii​ ≠\neq​= Bi_ii​
  • (Ai_ii​,Bi_ii​) are distinct.
  • All values in input are integers.

Input

Input is given from Standard Input in the following format:

N M
A1 B1
...
AM BM

Output

Print the answer.


Sample Input 1

3 3
1 2
2 3
3 2

Sample Output 1

7

We have seven pairs of cities that can be the origin and destination: (1,1),(1,2),(1,3),(2,2),(2,3),(3,2),(3,3).


Sample Input 2

3 0

Sample Output 2

3

We have three pairs of cities that can be the origin and destination: (1,1),(2,2),(3,3).


Sample Input 3

4 4
1 2
2 3
3 4
4 1

Sample Output 3

16

Every pair of cities can be the origin and destination.

题意

AtCoder王国有

  • N个编号为1到N的城市
  • M条编号为1到M的道路。

道路i从Ai_ii​市通往Bi_ii​市,但不能能用从Bi_ii​市通往Ai_ii​市。

彪马正在计划她的旅程,她从某个城市出发,沿着零条或多条道路旅行,然后在某个城市结束。

求有多少种起点和终点城市组合?

思路

  • 固定起始点,然后遍历到达可能的城市
  • 可以考虑使用DFS、BFS算法遍历

题解

小码匠: DFS

int n;
vector<bool>leaf(n);

void dfs(int x, vector<vector<int>> &vvi) {
    if(leaf[x]) {
        return;
    }
    leaf[x] = true;
    for(auto a : vvi[x]) {
        dfs(a, vvi);
    }
}

void coder_solution() {
    // 提升cin、cout效率
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int m, temp = 0;
    cin >> n >> m;
    vector<vector<int>> vvi(n);
    int a, b;
    for (int i = 0; i < m; i++) {
        cin >> a >> b;
        vvi[a - 1].push_back(b - 1);
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            leaf[j] = false;
        }
        dfs(i, vvi);
        for (int j = 0; j < n; j++) {
            if (leaf[j]) {
                temp++;
            }
        }
    }
}

小码匠: BFS

void best_solution() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n, m;
    cin >> n >> m;
    int a, b;
    vector<vector<int>> vvi(n);
    for(int i = 0; i < m; i++) {
        cin >> a >> b;
        vvi[a - 1].push_back(b - 1);
    }

    vector<int> dist(n, -1);
    queue<int> que;
    dist[0] = 0;
    int v;
    int j = 0;
    for(int i = 0; i < n; i++) {
        que.push(i);
        dist[i] = 0;
        while(!que.empty()) {
            v = que.front();
            que.pop();
            for(auto next_v : vvi[v]) {
                if (dist[next_v] != -1) {
                    continue;
                }
                dist[next_v] = dist[v] + 1;
                que.push(next_v);
            }
        }
        j += n - count(dist.begin(), dist.end(), -1);
        dist.assign(n, -1);
    }
    cout << j;
}

官方题解1:BFS

  • 一些语法感觉有些诡异,例如第8行,第14行的循环语句,老码农建议不要学,不符合多数人习惯
#include<bits/stdc++.h>
using namespace std;

int main(){
    int n, m;
    cin >> n >> m;
    auto e = vector(n, vector<int>());
    for(int i{}, a, b; i < (m); ++i){
        cin >> a >> b;
        --a, --b;
        e[a].push_back(b);
    }
    ll ans{};
    for(int s{}; s< (n); ++s){
        vector<bool> vis(n);
        vis[s] = true;
        queue<int> q;
        q.push(s);
        while(!q.empty()){
            ++ans;
            int i = q.front();
            q.pop();
            for(auto&j:e[i]) if(!vis[j]){
                vis[j] = true;
                q.push(j);
            }
        }
    }
    cout << ans << endl;
}

官方题解2:DFS

#include<bits/stdc++.h>

using namespace std;
const int MAX_N = 2000;
vector<vector<int>> G;
bool temp[MAX_N];

void dfs(int v) {
    if (temp[v]) {
        return;
    }
    temp[v] = true;
    for (auto vv: G[v]){
        dfs(vv);
    }
}

int main() {
    int N, M;
    cin >> N >> M;
    G.resize(N);
    for (int i = 0; i < M; i++) {
        int a, b;
        cin >> a >> b;
        G[a - 1].push_back(b - 1);
    }
    int ans = 0;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            temp[j] = false;
        }
        dfs(i);
        for (int j = 0; j < N; j++) {
            if (temp[j]){
                ans++;
            |
        }
    }
    cout << ans;
}

复盘

  • 动态数组初始化

    dist.assign(n, -1);
    
CARAFE轻量级上采样算子详解:从原理到YOLOv5/YOLOv8实战魔改全攻略 摘要: 本文探讨了CARAFE(内容感知特征重组)上采样算子在YOLOv5/YOLOv8目标检测模型中的应用。传统上采样方法(如最近邻插值)易丢失细节信息,而CARAFE通过内容自适应机制和大感受野特性,动态生成上采样核,显著提升小目标检测性能。文章详细解析了CARAFE的算法原理(核生成与特征重组两步),并提供了在YOLOv5/YOLOv8中集成的代码实现与配置修改方案。实验表明,引入CARAFE后模型mAP提升约0.6%,且保持轻量级优势。此外,文中还总结了训练调优技巧、部署优化方案及常见问题解决方法, 阅读详情

相关推荐

车底盘:阿克曼转向和四轮差速

特性四轮差速四轮转向阿克曼转向转向方式控制左右轮组速度差控制四个轮子的角度控制前轮角度(后轮固定)运动原理滑移摩擦(搓着走)纯滚动(滚着走)近乎纯滚动(低速时)能耗高低(实现纯滚动时)中轮胎磨损非常严重小中灵活性高(可原地旋转)极高(可全向移动)低(转弯半径大)控制精度较低(受地面摩擦影响大)极高高机械复杂度低(通常只需2个驱动电机)极高(需4个转向+4个驱动执行器)中(需1个转向+2个驱动执行器)典型应用坦克、履带车辆、简单AGV、扫地机器人豪华轿车、高性能全向AGV。

bing_feilong的博客 1925

AtCoder - ABC 270 - C(DFS+树上路径查询)

先跑一遍DFS求出每个节点的深度后,对于求结点 a,b 的路径,我们需要维护两个数组vector,数组 v1,v2 分别存从节点 a,b 开始的路径;fa[],要求的节点x到节点 y 的路径,就是从节点 x 一直向父节点遍历输出直到节点 y 即可。给定一棵有 N 个节点的树和两个节点 x,y ,按顺序输出从节点 x 到节点 y 的路径。拼接数组中所存的节点,顺序输出数组 v1 ,再输出两路径相遇处的节点 t ,最后。2. dfs预处理树中节点的深度,预处理以某一节点为根节点的所有节点的父节点。

m0_64172681的博客 821

【Python爬虫案例教学】超简洁代码采集原神所有角色信息

(。・∀・)ノ゙嗨 大家好,这里是池鱼

xiaoyuan_____的博客 2420

AtCoder Beginner Contest 204 赛后补题

E - Rush Hour 2 题目链接:https://atcoder.jp/contests/abc204/tasks/abc204_e 题意 给定一张无向图,一个人时刻ttt从一个点走到另一个点需要使用Ci+⌊Dit+1⌋C_i + \lfloor \frac{D_i}{t + 1} \rfloorCi​+⌊t+1Di​​⌋的时间。起点是1号点,终点是n号点,起始时刻是0,可以在某一点等待任意秒后再出发。求从起点到终点的最短时间。 思路 设到达uuu点的时刻为ttt,下一个点是vvv,设在u点等待了x

qq_45834992的博客 971

KEPServer EX6的Modbus、MQTT和REST Server一站式配置整理说明

KEPServer EX6的Modbus、MQTT和REST Server一站式配置整理说明

syqenter的专栏 8961

别再傻傻分不清了!用Design Compiler和PrimeTime实操对比PBA与GBA模式

本文深度解析静态时序分析(STA)中Design Compiler与PrimeTime工具的PBA与GBA模式差异,通过实际案例演示两种模式在转换时间计算、时钟路径分析等方面的对比,并提供工程实践中模式选择的策略与调试技巧,帮助工程师在芯片设计流程中平衡精度与效率。

weixin_42552315的博客 414

AtCoder Beginner Contest 192 E.Train

AtCoder Beginner Contest 192 E.Train 题目链接 Problem Statement In the Republic of AtCoder, there are N cities numbered 1 through N and M railroads numbered 1 through M. Railroad i connects City AiA_iAi​ and City BiB_iBi​ bidirectionally. At time 0, KiK_iKi​,

旺崽的博客 2268

用友U8接口开发全攻略:从EAI到OpenAPI的5种方式详解(附避坑指南)

本文深度解析了用友U8系统接口开发的五种核心方式:EAI、API、OpenAPI、SQL直连与内部CO组件。文章详细对比了各方式的适用场景、优缺点及实战操作,并提供了清晰的选型决策框架与避坑指南,帮助开发者根据具体业务需求选择最高效、最稳定的集成路径。

weixin_29322855的博客 684

AtCoder Beginner Contest 204 A~E 题解

ABC204 A~E 题解 A - Rock-paper-scissors B - Nuts C - Tour D - Cooking E - Rush Hour 2

天生我材必有用,千金散尽还复来。 9700

第一部分:VTK基础入门(第1章:VTK简介与概述)

VTK简介与核心特性概述 VTK(Visualization Toolkit)是一个开源的跨平台C++类库,专用于3D计算机图形学、图像处理和科学可视化。由Kitware公司开发,VTK自1993年起源以来,经历了开源化、成熟化和现代化多个发展阶段,现已成为科学可视化的核心工具之一。 VTK的核心特性包括: 管道架构:模块化设计实现数据流管理 丰富的数据支持:处理多边形数据、图像数据等 强大的渲染能力:集成OpenGL,支持多种渲染技术 最新版本VTK 9.4.2增强了现代C++支持,优化了内存管理,并提升

仰望星空的博客 2359

Android 车载开发深度解析:CarPropertyManager 核心机制与实践指南

摘要: Android Automotive OS中,CarPropertyManager作为车载信息娱乐系统的核心组件,连接应用层与车辆硬件(如车速、油量等),其架构基于分层设计(App→CarAPI→VHAL→ECU),采用发布-订阅模式实现高效数据通信。通过HIDL/AIDL跨进程交互及共享内存优化,延迟可降至2ms以下。安全机制包括分级权限控制(VISIBLE/PROTECTED/SYSTEM_RESTRICTED)和HMAC防篡改。开发时需注意监听器生命周期管理、事件合并降负载及低功耗适配。

郑伟强dev的专栏 344

AtCoder Beginner Contest 204(补题)

C - Tour 题意: 给个有向图,问你有多少对点,可以作为起点和终点,作为起点和终点,意味着可以从起点到终点。 思路: 直接从每个点 dfs一遍,看能到达的点有多少个,直接加起来即可。 #include<bits/stdc++.h> using namespace std; const int N=2010; int e[N],h[N],ne[N],idx; int n,m; bool st[N]; void add(int a,int b) { e[idx]=b,ne[idx]=

weixin_54699118的博客 710

在PPT里如何做出晶莹剔透的高级水泡感出来呢

水晶汽泡被大量使用在TED场景的演讲片稿中,给人以强烈的视觉冲击感。其实实现很简单。本篇就用三步教会大家如何制作这样的一种PPT效果。

打造全国最全的AI Agent开发知识领域的博客 1536

AtCoder Beginner Contest 204

AtCoder Beginner Contest 204

青少年趣味编程 1015

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

AtCoder - ABC 165 - F(DFS树) | 163 - F(容斥原理 + DFS树)

DFS树的两道题,后一道待再补补。

m0_64172681的博客 533

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

AtCoder - ABC 166 - F(DFS / 贪心)

题意:共操作 N 次,每次输入的是字符串。问能否在保证三个数都非负的条件下进行 n 次操作,如果可以输出Yes以及每次操作进行加1的那个字母;如果不能输出No。

m0_64172681的博客 432

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【ATcoder】【DFS | 哈希 +并查集 | BFS 】Alternating Path

题目链接: 题意: 这个题目的意思是:给定一个h*w的方格内,只有' . ' 和 ' # ' 两个符号, 请问有多少条路径是  ' . '   ------&gt;  ' # '  ,其中路径中必须是 ' . ' 和 ’ # ‘ 相间。 小结: 这个题真的不会做,我当时就懵逼了,啥都不知道,然后看了网友的做法,发现原来就是找联通块,只要找到联通块就行了,这个答案就是: ans=每个联通...

Z_sea的博客 492

AtCoder - ABC 326 - D - ABC Puzzle (DFS)

看了很多题解都是写了一大坨,看起来非常的混乱,然而自己去写的时候又不可避免的写了一坨,只能尽可能的去优化代码可读性。

2302_79440616的博客 1839

AtCoder Beginner Contest 231 E 贪心 DFS 记忆化搜索

题目 有N种货币,每种对应ai元,a1一定等于1,且ai-1一定是ai的倍数。 求出完成一笔X元的交易所需的最小货币数。 即支付钱加找钱所需的货币数加起来最小。 题解思路 贪心策略 用这个付完,即不找零。 要么用这个多付钱(前提是本来有多,否则就是白费的搜索)然后求最小的找零数。 在这两种情况中取min 因为a是从1开始的,所以必然能取到数。 这题复杂度一言难尽,居然能这么暴力。 AC代码 #include <bits/stdc++.h> //#include <unordered_map

从你的全世界路过 525

atcoder Low Range-Sum Matrix dfs

问题 F: Low Range-Sum Matrix 时间限制:1 Sec内存限制:128 MB 提交:83解决:9 [提交] [状态] [命题人:admin] 题目描述 You received a card at a banquet. On the card, a matrix of N rows and M columns and two integers K and ...

喵喵喵 380

AtCoder abc320 D,题解居然敢用 DFS?

使用 DFS,在本地电脑上运行,直接堆栈溢出。就容易爆栈,它居然敢用。

qq_36224021的博客 286

AtCoder 3596 C - Bridge_DFS

AtCoder 3596 C - Bridge Problem Statement 连通的定义是:图中的任意两个点之间能互相到达。 给你一个包含n个点,m条边的无向图.如果去掉某条边之后,该图不连通了.那么这条边称为“special edge”.输出"special edge"的个数.Input第一行两个整数n,m(n<=50,m<=min(n*(n-1))/2,50).接下来m行...

weixin_30414635的博客 472

【AtCoder - abc311_d】Grid Ice Floor【DFS】

显然搜索题,但是范围是两百,不能每个点都递归,参照之前的题,会出现一些能递归的关键点。我们先对于每个点上下左右走到头,求出每个点对应的下一个关键点,然后从起点开始递归,对于每个点记录有没有“走过”,和有没有递归过,然后到达每个点都去找关键点就行。

ssllyr 393

AtCoder Beginner Contest 165 C.Many Requirements

AtCoder Beginner Contest 165 C.Many Requirements 题目链接 很多人看到题目就懵了,我个人感觉这题位置不好,比D要难一点????,我说的难是指难想一点~ 一开始大家肯定比较懵,看来半天读懂了题目意思,但是却想不到最优解法,我们不妨观察一下 N,MN,MN,M 的范围,立马想到了暴力,没错,我们就暴力列举所有 A 可能的排列情况即可,用到了 DFSDFSDF...

旺崽的博客 2709

AtCoder abc_264 C - Matrix Reducing(嵌套 dfs)

嵌套 dfs

Jacob0824的博客 1074

atcoder 167 C(dfs)

题目传送门 文章目录思路:废话: 思路: 这道题范围比较小,直接暴力搜索就行(可是本蒟弱,比赛时没做出来。。。) 对于每一本书要么买,要么不买,递归遍历n本书 开始没理解到这个dfs怎么设计。。。 参考:大佬文章 #include <iostream> #include<algorithm> using namespace std; const int maxn = 20; int a[maxn][maxn]; int ans = 1e9; int n,m,x; int Get[m

qq_45769627的博客 400
上一篇: 一文全面了解PostgreSQL常用命令
下一篇: 动态规划基础题(第1题):被变换的菲波那切数列
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

小码匠和老码农

喜欢作者

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

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

打赏作者

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

抵扣说明:

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

余额充值