# CF402E_Strictly Positive Matrix

题意:

有一个正方形矩阵 D,大小为 n*n,其中的每个数字非负

问,是否存在一个数 k,使得 Dk 为一个严格正矩阵

一个严格正矩阵定义为,其中每个数都严格大于0


解:

众所周知,对于一个01邻接矩阵 D,若 Dk(i,j)=1,说明 i, j 之间存在一条经过 k 条边的路径

那么考虑本题,我们要让一个矩阵为严格正矩阵,而其中每个数本来就非负

所以,问题就是要让一些为0的数变得不为0

所以,考虑一个位置为0,若 k 无论取多少,都不能使其为正

那就意味着,无论从 i 走多少条边,都无法到达 j

那就意味着,i, j 不连通!

所以,我们看看这一张图是不是一个强连通图就好了,

跑一遍tarjan,看scc个数是不是1,完事


代码:

#include <bits/stdc++.h> using namespace std; const int N = 2010; bool a[N][N]; int dfn[N], low[N]; int stck[N], ins[N], c[N]; vector<int> scc[N]; int n, tot, num, top, cnt; void tarjan(int x) { dfn[x] = low[x] = ++num; stck[++top] = x, ins[x] = 1; for (int y = 1; y <= n; y++) { if (a[x][y] == 0) continue; if (!dfn[y]) { tarjan(y); low[x] = min(low[x], low[y]); } else if (ins[y]) low[x] = min(low[x], dfn[y]); } if (dfn[x] == low[x]) { cnt++; int y; do { y = stck[top--], ins[y] = 0; c[y] = cnt, scc[cnt].push_back(y); } while (x != y); } } int main() { cin >> n; for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) { int tmp; scanf("%d", &tmp); if (tmp != 0) a[i][j] = true; else a[i][j] = false; } for (int i = 1; i <= n; i++) if (!dfn[i]) tarjan(i); if (cnt == 1) cout << "YES" << endl; else cout << "NO" << endl; }

__EOF__

本文作者熹圜
本文链接https://www.cnblogs.com/Xiwon/p/13572251.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   熹圜  阅读(158)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示