博客
关于我
hdu2767(强连通分量+缩点)
阅读量:245 次
发布时间:2019-03-01

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

为了解决这个问题,我们需要证明四个关于矩阵 A 的命题是等价的。我们可以通过分析这些命题之间的关系,并利用图论中的强连通分量和有向无环图(DAG)来确定需要证明的额外边数。

方法思路

  • 问题分析:四个命题分别是矩阵 A 是否可逆、方程 Ax = b 是否有唯一解、方程 Ax = b 是否一致,以及 Ax = 0 是否只有零解。这些命题之间存在等价关系,我们需要证明这些关系。
  • 图论模型:将四个命题看作图中的四个节点,已知的关系作为有向边。我们需要确定这些边是否已经形成了一个强连通图。
  • 强连通分量分析:使用 Kosaraju 算法来分析强连通分量。缩减后的 DAG 中,入度为零的点数和出度为零的点数决定了需要添加的最少边数。
  • 计算步骤:构建图,执行强连通分量分析,统计入度和出度,最后计算并输出结果。
  • 解决代码

    import sys
    sys.setrecursionlimit(1 << 25)
    def main():
    import sys
    input = sys.stdin.read().split()
    ptr = 0
    T = int(input[ptr])
    ptr += 1
    for _ in range(T):
    n = int(input[ptr])
    m = int(input[ptr+1])
    ptr +=2
    adj = [[] for _ in range(4)]
    for __ in range(m):
    s1 = int(input[ptr])-1
    s2 = int(input[ptr+1])-1
    adj[s1].append(s2)
    ptr +=2
    # Build reverse graph
    rev_adj = [[] for _ in range(4)]
    for u in range(4):
    for v in adj[u]:
    rev_adj[v].append(u)
    # First pass to compute order
    visited = [False]*4
    dfn = [0]*4
    low = [0]*4
    order = []
    time = 1
    for u in range(4):
    if not visited[u]:
    stack = []
    stack.append( (u, False) )
    while stack:
    node, processed = stack.pop()
    if processed:
    for v in adj[node]:
    if dfn[v] > dfn[node]:
    low[node] = min(low[node], dfn[v])
    if low[node] == dfn[node]:
    order.append(node)
    continue
    if visited[node]:
    continue
    visited[node] = True
    dfn[node] = time
    low[node] = time
    time +=1
    stack.append( (node, True) )
    for v in adj[node]:
    if not visited[v]:
    stack.append( (v, False) )
    # Second pass to find components
    visited = [False]*4
    component = [0]*4
    current_component = 0
    for u in reversed(order):
    if not visited[u]:
    stack = [u]
    visited[u] = True
    component[u] = current_component
    while stack:
    node = stack.pop()
    for v in rev_adj[node]:
    if not visited[v]:
    visited[v] = True
    component[v] = current_component
    stack.append(v)
    current_component +=1
    # Calculate in_degree and out_degree for DAG
    in_degree = [0]*4
    out_degree = [0]*4
    for u in range(4):
    for v in adj[u]:
    out_degree[u] +=1
    for v in rev_adj[u]:
    in_degree[v] +=1
    a = sum(1 for i in range(4) if in_degree[i] == 0)
    b = sum(1 for i in range(4) if out_degree[i] == 0)
    res = max(a, b)
    print(res)
    if __name__ == "__main__":
    main()

    代码解释

  • 输入处理:读取测试用例数目和每个测试用例的数据。
  • 图构建:构建节点之间的有向边,并构建反向图。
  • 第一次 DFS:计算每个节点的 dfn 和 low 值,记录访问顺序。
  • 第二次 DFS:根据反向图,确定强连通分量。
  • DAG 分析:计算缩减后的 DAG 中的入度和出度,确定需要添加的最少边数。
  • 该方法确保了我们能够高效地确定需要证明的最少边数,从而完成所有命题的等价性证明。

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

    你可能感兴趣的文章
    Nginx配置ssl实现https
    查看>>
    Nginx配置TCP代理指南
    查看>>
    Nginx配置——不记录指定文件类型日志
    查看>>
    nginx配置一、二级域名、多域名对应(api接口、前端网站、后台管理网站)
    查看>>
    Nginx配置代理解决本地html进行ajax请求接口跨域问题
    查看>>
    nginx配置全解
    查看>>
    Nginx配置参数中文说明
    查看>>
    nginx配置域名和ip同时访问、开放多端口
    查看>>
    Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
    查看>>
    Nginx配置如何一键生成
    查看>>
    Nginx配置实例-负载均衡实例:平均访问多台服务器
    查看>>
    Nginx配置文件nginx.conf中文详解(总结)
    查看>>
    Nginx配置负载均衡到后台网关集群
    查看>>
    ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名
    查看>>
    NHibernate学习[1]
    查看>>
    NHibernate异常:No persister for的解决办法
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
    查看>>
    NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
    查看>>