记录165
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n,m,cntC=0,cntG=0,t;// 来是come -> cntC ,去是GO -> cntG
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>t;
if(i==m&&t==1) cntG++;
if(j==m&&t==1) cntC++;
}
}
cout<<cntG<<" "<<cntC<<" "<<cntG+cntC;
return 0;
}
题目传送门
https://www.luogu.com.cn/problem/P10265
前言
我是一名专注信奥赛(GESP、CSP-J/S)的教练。
- 如果你觉得这篇题解对你有帮助,欢迎点击关注我的CSDN账号,我会持续更新高质量算法解析。
- 我深知算法思维的构建远比单纯通过题目更重要,本系列题解不局限于AC代码的堆砌,而是致力于拆解题目背后的逻辑链条与核心知识点
- 备赛路上若遇瓶颈,欢迎随时评论或私信,我将甄选典型疑难问题,通过视频讲解或撰写专项文章的形式,为你提供深度答疑。
核心解题思路
-
读懂矩阵含义:
题目给出的邻接矩阵中,第 i 行第 j 列的数字t代表i -> j的连通性。- 如果
t == 1,说明 i 能到 j。
- 如果
-
统计“去”的数量(出度):
我们要找 m 号迷宫能直接到达 多少个迷宫。- 这对应矩阵的 第 m 行。
- 遍历第 m 行,统计有多少个
1。
-
统计“来”的数量(入度):
我们要找 有多少迷宫能直接到达 m 号迷宫。- 这对应矩阵的 第 m 列。
- 遍历第 m 列,统计有多少个
1。
-
关于自身:
题目说“i 号迷宫总可以直接到达自身”,意味着矩阵对角线a[i][i]一定是 1。我们在统计行和列时,自然会把这个 1 算进去,完全符合题目“包含自身”的要求,无需特殊处理。
代码分块详细解释
1. 头文件与 IO 优化
#include<bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
- 详细分析:
n最大为 1000,矩阵元素有 10^6 个。虽然 10^6 的 cin 通常能过,但加上ios::sync_with_stdio(false);和cin.tie(0);是处理大规模矩阵输入的标准操作,能确保不会因为 IO 瓶颈超时。
2. 变量定义与输入框架
int n, m, cntC = 0, cntG = 0, t; // 来是come -> cntC ,去是GO -> cntG
cin >> n >> m;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= n; j++){
cin >> t;
- 详细分析:
cntG(Go):记录 m 能到达多少个点(第 m 行的 1 的个数)。cntC(Come):记录多少个点能到达 m(第 m 列的 1 的个数)。- 使用双重循环读取矩阵,用临时变量
t接收当前读入的值,不需要开二维数组存整个矩阵,这是本题最大的优化点!空间复杂度从 O(n^2) 降到了 O(1)。
3. 核心逻辑:边读边统计
if(i == m && t == 1) cntG++;
if(j == m && t == 1) cntC++;
}
}
- 详细分析:这是代码的灵魂,极其精简。
- 判断出边:当行号
i等于目标m且值为 1 时,说明m -> j连通,cntG++。 - 判断入边:当列号
j等于目标m且值为 1 时,说明i -> m连通,cntC++。 - 注意:当
i == m && j == m时(即读到对角线上的自身),两个if都会执行。这正好对应了题目中“m 能到达 m”和“m 能到达 m”各算一次,逻辑完美闭环。
- 判断出边:当行号
4. 输出结果
cout << cntG << " " << cntC << " " << cntG + cntC;
return 0;
}
- 详细分析:按题目要求,依次输出“去”的数量、“来”的数量、以及两者的总和。
核心逻辑总结表
| 代码模块 | 核心变量/操作 | 精炼作用 | 解决的痛点 |
|---|---|---|---|
| 空间优化 | 单变量 t 接收 | 边读边处理,不存矩阵 | 避免开 1000×1000 数组,节省内存,缓存更友好 |
| 出度统计 | if(i==m && t==1) | 锁定第 m 行,统计 1 的个数 | 解决“m 能直接到达多少个迷宫”的问题 |
| 入度统计 | if(j==m && t==1) | 锁定第 m 列,统计 1 的个数 | 解决“多少个迷宫能直接到达 m”的问题 |
| 自身处理 | 双重 if 自然包含 | 对角线元素同时满足行、列条件 | 无需额外判断 i==j,代码更简洁且逻辑正确 |
| IO 加速 | ios::sync_with_stdio(false) | 关闭 C++ 与 C 流同步 | 应对 10^6 级别的数据输入,防止 TLE |
易错点提示
- 行列搞反:
i是行(出发点),j是列(到达点)。m在行里是“去”,在列里是“来”。 - 自身重复计算:题目要求包含自身,且最后求和是
cntG + cntC,所以m->m被算两次是完全正确的,千万不要去重! - 数据范围:n=1000 时,元素有 100 万个,必须用
int或更快的读入,cin加速后完全没问题。

1284

被折叠的 条评论
为什么被折叠?



