P10265 [GESP样题 七级] 迷宫统计

题目描述

在神秘的幻想⼤陆中,存在着 n 个古老而神奇的迷宫,迷宫编号从 1 到 n。有的迷宫之间可以直接往返,有的可以⾛到别的迷宫,但是不能⾛回来。玩家小杨想挑战⼀下不同的迷宫,他决定从 m 号迷宫出发。现在,他需要你帮助他统计:有多少迷宫可以直接到达 m 号迷宫,m 号迷宫可以直接到达其他的迷宫有多少,并求出他们的和。

需要注意的是,对于 i (1≤i≤n) 号迷宫,它总可以直接到达自身。

输入格式

第一行两个整数 n 和 m,分别表示结点迷宫总数,指定出发迷宫的编号。

下面 n 行,每行 n 个整数,表示迷宫之间的关系。对于第 i 行第 j 列的整数,1 表示能从 i 号迷宫直接到达 j 号迷宫,0 表示不能直接到达。

输出格式

一行输出空格分隔的三个整数,分别表示迷宫 m 可以直接到达其他的迷宫有多少个,有多少迷宫可以直接到达 m 号迷宫,这些迷宫的总和。

输入输出样例

输入 #1

复制代码
6 4
1 1 0 1 0 0
0 1 1 0 0 0
1 0 1 0 0 1
0 0 1 1 0 1
0 0 0 1 1 0
1 0 0 0 1 1

输出 #1

复制代码
3 3 6

题目要求给出有向图中可到达某节点的节点数与某节点可到达的节点数,我们可以用两个共轭的邻接表来存储。

#include<bits/stdc++.h>
using namespace std;

int main(){
    int n, m;
    cin>>n>>m;
    vector<vector<int>> mat(n+1); // 某节点能到达的节点的邻接表
    vector<vector<int>> re_mat(n+1); // 能到达某节点的邻接表
    for(int i = 1;i<=n;i++){
        for(int j = 1;j<=n;j++){
            int tmp;
            cin>>tmp;
            if(tmp){
                mat[i].push_back(j);
                re_mat[j].push_back(i);
            }
        }
    }
    int ans1, ans2, ans3;
    ans2 = re_mat[m].size();
    ans1 = mat[m].size();
    ans3 = ans1+ans2;
    cout<<ans1<<' '<<ans2<<' '<<ans3;
    return 0;
}
相关推荐
axxy20008 分钟前
C++ Primer Plus第九章课后习题总结
开发语言·c++·算法
weixin_5358542227 分钟前
优博讯,蓝禾,三七互娱,顺丰,oppo,游卡,汤臣倍健,康冠科技,作业帮,高途教育25届春招内推
java·嵌入式硬件·算法·硬件工程·软件工程
Erik_LinX39 分钟前
算法日记33:15届蓝桥C++B组R格式(快速幂50%/高精度100%)
c++·算法
青瓦梦滋1 小时前
【语法】C++中string类中的两个问题及解答
开发语言·c++·算法
我不是彭于晏丶1 小时前
蓝桥杯 灯笼大乱斗【算法赛】
算法
Cosmoshhhyyy1 小时前
LeetCode:132. 分割回文串 II(DP Java)
算法·leetcode
EnigmaCoder2 小时前
蓝桥杯刷题周计划(第一周)
c++·学习·算法·蓝桥杯
邴越2 小时前
LeetCode 148:排序链表 (Sort Linked List)
算法·leetcode·链表
小yu学编程2 小时前
Java---入门基础篇(下)---方法与数组
java·开发语言·算法
迷茫小玄森3 小时前
基于决策树和随机森林的鸢尾花种类预测
人工智能·学习·算法·决策树·随机森林·机器学习