【题解】[GESP样题 七级] 迷宫统计
题目描述
在神秘的幻想⼤陆中,存在着 nnn 个古老而神奇的迷宫,迷宫编号从 111 到 nnn。有的迷宫之间可以直接往返,有的可以⾛到别的迷宫,但是不能⾛回来。玩家小杨想挑战⼀下不同的迷宫,他决定从 mmm 号迷宫出发。现在,他需要你帮助他统计:有多少迷宫可以直接到达 mmm 号迷宫,mmm 号迷宫可以直接到达其他的迷宫有多少,并求出他们的和。
需要注意的是,对于 iii (1≤i≤n1 \leq i \leq n1≤i≤n) 号迷宫,它总可以直接到达自身。
输入格式
第一行两个整数 nnn 和 mmm,分别表示结点迷宫总数,指定出发迷宫的编号。
下面 nnn 行,每行 nnn 个整数,表示迷宫之间的关系。对于第 iii 行第 jjj 列的整数,111 表示能从 iii 号迷宫直接到达 jjj 号迷宫,000 表示不能直接到达。
输出格式
一行输出空格分隔的三个整数,分别表示迷宫 mmm 可以直接到达其他的迷宫有多少个,有多少迷宫可以直接到达 mmm 号迷宫,这些迷宫的总和。
输入输出样例 #1
输入 #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
说明/提示
样例 1 解释
444 号迷宫能直接到达的迷宫有 3,4,63,4,63,4,6 号迷宫,共 333 个。
能直接到达 444 号迷宫的迷宫有 1,4,51,4,51,4,5 号迷宫,共 333 个。
共 6 个。
数据规模与约定
| 子任务 | 分值 | $n \leq $ |
|---|---|---|
| 111 | 303030 | 101010 |
| 222 | 303030 | 100100100 |
| 333 | 404040 | 100010001000 |
对全部的测试数据,保证 1≤m≤n≤10001 \leq m \leq n \leq 10001≤m≤n≤1000。
题目分析
目的:统计有多少迷宫可以直接到达 mmm 号迷宫,mmm 号迷宫可以直接到达其他的迷宫有多少,并求出他们的和。
注意题目要求的是直接到达mmm号迷宫和mmm号迷宫可以直接到达其他的迷宫的数量,而不是间接到达。直接到达指存在直接相连的边,间接到达指存在连通的路径,两者需要进行区分。
从描述的定义来看,mmm号迷宫可以直接到达其他的迷宫数量就是mmm的出度,可以直接到达mmm号迷宫的数量就是mmm号迷宫的入度。
那么我们在输入图的信息时,可以直接统计相应的出入度信息,最后输出mmm号迷宫的入度、出度以及它们的和即可。
代码实现
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
const int N = 1005;
int in[N],out[N];
//in[i]:i的入度
//out[i]:i的出度
int n,m;
int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);cin>>n>>m;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){int w;cin>>w;if(w){//i可以到达j时,统计对应的入度、出度in[j]++;out[i]++; }}}//输出m号迷宫可以直接到达的其他迷宫的数量(m的出度)//输出可以直接到达m号迷宫的迷宫数量(m的入度)//输出这两者的和cout<<out[m]<<" "<<in[m]<<" "<<in[m]+out[m];return 0;
}
