博客
关于我
E. Strictly Positive Matrix [强联通+矩阵幂转图论+缩点] 好题
阅读量:537 次
发布时间:2019-03-08

本文共 1702 字,大约阅读时间需要 5 分钟。

为了确定是否存在一个正整数 ( k ) 使得矩阵 ( a^k ) 是严格正的,我们需要分析矩阵所表示的有向图的强连通性。具体来说,我们需要判断该图是否为强连通图。

方法思路

  • 矩阵分析转换为图论问题:将矩阵 ( a ) 视为一个有向图,其中 ( a[i][j] > 0 ) 表示存在一条边从节点 ( i ) 指向节点 ( j )。
  • 强连通性判断:使用 Tarjan 算法来检测图的强连通分量数量。如果强连通分量数量为 1,则图是强连通的,否则不是。
  • DFS 算法:执行深度优先搜索 (DFS) 来计算每个节点的最低入时间 (Low value),并确定强连通分量的数量。
  • 解决代码

    #include 
    #include
    #include
    #include
    #include
    using namespace std;const int MAX_N = 2002;const int MOD = 1e9 + 7;const int INF = 0x3f3f3f3f;vector
    > adj(MAX_N);int DFN[MAX_N], LOW[MAX_N], s = 1, top = 0, cnt = 0;bool visited[MAX_N];stack
    stack;void dfs_iterative(int u) { stack.push(u); int index = 0; while (!stack.empty()) { int v = stack.top(); if (v != u && DFN[v] != 0) { stack.pop(); continue; } if (DFN[v] != 0) { if (LOW[u] > DFN[v]) LOW[u] = DFN[v]; continue; } DFN[v] = top++; LOW[v] = top++; visited[v] = true; if (index == 0) { index = 1; } else if (index == 1) { index = 2; } else { stack.push(u); index = 0; continue; } for (int i = 0; i < adj[v].size(); ++i) { int to = adj[v][i]; if (!visited[to]) { stack.push(to); index = 0; } else if (DFN[to] != 0 && !visited[to]) { if (LOW[u] > DFN[to]) LOW[u] = DFN[to]; } } }}int main() { int n; read(n); for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) { int x; read(x); if (x > 0) { adj[i].push_back(j); } } } for (int i = 1; i <= n; ++i) { if (!visited[i]) { dfs_iterative(i); if (LOW[i] == DFN[i]) { cnt++; } } } if (cnt == 1) { cout << "YES" << endl; } else { cout << "NO" << endl; } return 0;}

    代码解释

  • 输入处理:读取矩阵并构建邻接表 adj
  • DFS 实现:使用非递归 DFS 来计算每个节点的最低入时间和强连通分量数量。
  • 强连通性判断:检查强连通分量的数量。如果为 1,输出 "YES",否则输出 "NO"。
  • 该方法通过图论中的强连通性检测,确保了算法的正确性和高效性,能够在较大规模的输入下快速得到结果。

    转载地址:http://jkkiz.baihongyu.com/

    你可能感兴趣的文章
    php如何定义的数位置,php如何实现不借助IDE快速定位行数或者方法定义的文件和位置...
    查看>>
    RabbitMQ集群 - 普通集群搭建、宕机情况
    查看>>
    PHP如何读取json数据
    查看>>
    PHP字符串
    查看>>
    PHP字符串递增
    查看>>
    php学习之基础语法
    查看>>
    RabbitMQ集群 - 仲裁队列、Raft协议(最详细的选举流程)
    查看>>
    PHP学习总结(11)——PHP入门篇之WAMPServer多站点配置
    查看>>
    PHP学习总结(12)——PHP入门篇之变量
    查看>>
    PHP学习总结(13)——PHP入门篇之常量
    查看>>
    PHP学习总结(14)——PHP入门篇之常用运算符
    查看>>
    PHP学习总结(1)——PHP入门篇之PHP可以做什么?
    查看>>
    PHP学习总结(2)——PHP入门篇之PHP代码标识
    查看>>
    PHP学习总结(4)——PHP入门篇之PHP计算表达式
    查看>>
    PHP学习总结(5)——PHP入门篇之PHP字符串
    查看>>
    PHP学习总结(7)——PHP入门篇之PHP注释
    查看>>
    rabbitmq重启失败
    查看>>
    PHP学习总结(9)——PHP入门篇之WAMPServer服务控制面板介绍
    查看>>
    php学习笔记---php调试和开发工具整理
    查看>>
    PHP学习笔记一:谁动了你的mail(),PHP?
    查看>>