UVALive - 4287 Proving Equivalences

UVALive - 4287 Proving Equivalences【强连通缩点】【Tarjan算法】 题意:   给出N个命题,要求你证明这N个命题的等价性   比如有4个命题a,b,c,d,我们证明a<->b, b<->c,c<->d,每次证明都是双向的,因此一共用了6次推导 如果换成证明a->b,b->c,c->d,d->a,每次证明都是单向的,而只需4次就可以证明所有命题的等价性 现在给出M个命题证明,问还需要证明几个,才可以保证N个命题等价。 分析:   缩点后求DAG中入度为0和出度为0的联通块的较大值。 此题在刘汝佳《算法竞赛入门经典训练指南》P322 此题和POJ1236差不多 阅读详情

给定n个命题之间的已经证明的关系如 a b表示已经证明蕴含式a→b,要求还需要再作多少次证明使得所有的命题都是等价的.将每个命题看成一个点,已经证明的命题之间连一条边,问题转化为添加多少条单向边使得图成为一个强连通分量.

先求出所有的强连通分量,然后缩点构成一个SCC图,统计其中入度为0的点个数a,以及出度为0的点的个数b,max(a,b)就是需要再作的证明.注意当图一开始就是强连通时,不需要作出证明了.

来自刘汝佳算法训练指南代码:

#include <iostream>
#include <sstream>
#include <cstdio>
#include <climits>
#include <cstring>
#include <cstdlib>
#include <string>
#include <stack>
#include <map>
#include <cmath>
#include <vector>
#include <queue>
#include <algorithm>
#define esp 1e-6
#define pi acos(-1.0)
#define pb push_back
#define mp(a, b) make_pair((a), (b))
#define in  freopen("in.txt", "r", stdin);
#define out freopen("out.txt", "w", stdout);
#define print(a) printf("%d\n",(a));
#define bug puts("********))))))");
#define stop  system("pause");
#define Rep(i, c) for(__typeof(c.end()) i = c.begin(); i != c.end(); i++)
#define pragma comment(linker, "/STACK:102400000, 102400000")
#define inf 0x0f0f0f0f

using namespace std;
typedef long long  LL;
typedef vector<int> VI;
typedef pair<int, int> pii;
typedef vector<pii,int> VII;
typedef vector<int>:: iterator IT;
const int maxn = 22222;
int pre[maxn], lowlink[maxn], sccno[maxn], dfs_clock, scc_cnt;
int in0[maxn], out0[maxn];
VI g[maxn];
stack<int> S;
void dfs(int u)
{
    S.push(u);
    lowlink[u] = pre[u] = ++dfs_clock;
    for(int i = 0; i < g[u].size(); i++)
    {
        int v = g[u][i];
        if(!pre[v])
        {
            dfs(v);
            lowlink[u] = min(lowlink[u], lowlink[v]);
        }
        else if(!sccno[v])
        {
            lowlink[u] = min(lowlink[u], pre[v]);
        }
    }
    if(lowlink[u] == pre[u])
    {
        scc_cnt++;
        for(;;)
        {
            int x = S.top();
            S.pop();
            sccno[x] = scc_cnt;
            if(x == u) break;
        }
    }
}
void find_scc(int n)
{
    memset(pre, 0, sizeof(pre));
    memset(sccno, 0, sizeof(sccno));
    dfs_clock = scc_cnt = 0;
    for(int i = 0; i < n; i++)
        if(!pre[i]) dfs(i);
}
int main(void)
{in
    int n, m;
    int T;
    for(int t = scanf("%d", &T); t <= T; t++)
    {
        for(int i = 0; i < maxn; i++)
            g[i].clear();
        memset(in0, 1, sizeof(in0));
        memset(out0, 1, sizeof(out0));
        scanf("%d%d", &n, &m);
        while(m--)
        {
            int u, v;
            scanf("%d%d", &u, &v);
            u--, v--;
            g[u].pb(v);
        }
        find_scc(n);
        for(int u = 0; u < n; u++)
            for(int i = 0; i < g[u].size(); i++)
            {
                int v = g[u][i];
                if(sccno[v] != sccno[u])
                    in0[sccno[v]] = out0[sccno[u]] = 0;
            }
        int a = 0, b= 0;
        for(int i = 1; i <= scc_cnt; i++)
        {
            if(in0[i]) a++;
            if(out0[i]) b++;
        }
        int ans = 0;
        if(scc_cnt != 1) ans = max(a, b);
        printf("%d\n",ans);
    }
    return 0;
}
微店构造订单页面,自动化抢票 之前的文章写过微店抢票如何构造订单页面分析,这篇文章在之前的基础上,进行抢票。 阅读详情

相关推荐

拯救者R7000用户实测:用华为电脑管家11.0版搞定MatePad Pro多屏协同(附驱动与显卡避坑指南)

本文详细介绍了如何在非华为笔记本联想拯救者R7000上安装华为电脑管家11.0版,实现与MatePad Pro的多屏协同功能。从驱动优化到显卡配置,提供了全面的避坑指南和实用技巧,帮助用户解决连接失败等常见问题,提升跨设备生产力体验。

weixin_30788619的博客 398

Proving Equivalences UVALive 4287 图的强连通分量

Consider the following exercise, found in a generic linear algebra textb o ok. Let A be an n × n matrix. Prove that the following statements are equivalent: (a) A is invertible. (b) Ax = b h

香蕉麦乐迪的博客 860

高通Sensor Tuning实战:手把手教你用Chromatix生成并打包bin文件(附避坑指南)

本文详细介绍了高通Sensor Tuning的全流程实战,从Chromatix配置到Bin文件加载验证。通过手把手教程,帮助开发者掌握Chromatix工具链的使用,避免常见配置错误,提升调试效率。特别针对kalama等新一代平台,提供经过验证的解决方案和避坑指南。

ios99的博客 483

UvaLive-4287- Proving Equivalences

这个题是一个有向图强连通分量~,跟着书上做的~ 代码: #include #include #include #include #include using namespace std; const int maxn=40001; int n,m,dfs_clock,scc_cnt; int sccno[maxn],pre[maxn],lowlink[maxn],in[maxn],out[ma

z309241990的专栏 634

S32K344 Bootloader实战:一个按键实现从Boot到App的无缝跳转(附完整代码)

本文详细介绍了基于NXP S32K344微控制器的Bootloader开发实战,重点解析如何通过一个硬件按键实现从Boot到App的可靠跳转。内容涵盖内存分区规划、中断向量表重映射、外设初始状态管理等核心要素,并提供了完整的代码示例和调试技巧,适用于汽车电子和工业控制等高可靠性应用场景。

weixin_29192365的博客 307

【gcc】跨版本兼容实战:高版本编译程序在低版本glibc环境下的部署方案

本文针对高版本gcc编译的程序在低版本glibc环境下部署的兼容性问题,提供了四种实战解决方案:静态编译的局限性、容器化部署的优雅方案、使用Devtoolset工具链的官方支持,以及最通用灵活的打包依赖SO发布方案。重点剖析了通过设置RPATH和Interpreter或使用patchelf工具,实现程序与自带库的独立部署,有效解决glibc版本鸿沟。

weixin_29237635的博客 362

UvaLive-4287-Proving Equivalences

有向图的双联通分量,

z309241990的专栏 557

VT System故障排查指南:从License验证到硬件连接全解析

本文详细解析VT System故障排查全流程,从License验证、Real Bus模式设置到硬件连接与VT6000组网配置。针对VT7900板卡等特殊设备提供专业解决方案,并分享系统级故障的二分法排查技巧,帮助工程师快速定位和解决CANoe环境下的各类硬件识别问题。

weixin_29269441的博客 255

UVALive - 4287 - Proving Equivalences(强连通分量)

Problem UVALive - 4287 -Proving Equivalences Time Limit: 3000 mSec Problem Description Input Output Sample Input 2 4 0 3 2 1 2 1 3 ...

weixin_30618985的博客 171

Nginx下ModSecurity模块安装详细教程

本文提供了在Nginx 1.28.0上安装ModSecurity v3的完整教程。首先需安装编译依赖,然后从源码编译安装ModSecurity库并设置优化参数。接着编译Nginx动态模块并配置加载。核心配置包括设置规则引擎、日志路径及性能优化参数。安装OWASP核心规则集后,在Nginx站点配置中启用ModSecurity。最后测试规则有效性并给出性能优化建议,如规则排除、精简规则集等。整个过程包含详细的命令和配置示例,确保安全防护功能正常运作。

深山技术宅的博客 1784

筑牢上线前安全防线:安全运维服务中的检测实践与深化

在日益严峻的网络安全形势下,将漏洞扫描、渗透测试和基线核查有机结合的上线前安全检测,是保障信息系统安全、稳定、合规上线的基石。通过专业、严谨、协作的检测实践,乙方安全团队能够有效协助甲方在系统生命周期的起点就构筑起坚固的安全防线,为业务的顺利开展和用户的信任保驾护航,真正实现“安全赋能业务”的价值。这道“守门人”的职责,是数字时代企业稳健前行的不可或缺的保障。专业的安全服务提供商(乙方)需要与甲方(系统所有者/运营方)建立紧密、透明、协作的伙伴关系,实现风险的闭环管理,甚至推动甲方安全能力的长期提升。

huluang的专栏 183

UVALive 4287 Proving Equivalences(缩点)

等价性问题,给出的样例为 a->b的形式,问要实现全部等价(即任意两个可以互相推出),至少要加多少个形如 a->b的条件。 容易想到用强连通缩点,把已经实现等价的子图缩掉,最后剩余DAG。要推出一个方案,YY后取“出度为零”和“入度为零”的点数的较大值。 理由:假定出度为零的点数较多,即是我们通常意义上的树的形式(当然,DAG是图,这里只是类比)。 根可以推出其所有子孙...

aizhengcuo9261的博客 130

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

UVALIVE 4287 Proving Equivalences (强连通分量+缩点)

题意:给定一个图,问至少添加多少条边可以使这个图强连通。 思路:首先求出这个图的强连通分量,然后把每一个强连通分量缩成一个点,那么这个图变成了一个DAG,求出所有点的入度和出度,因为强连通图中每个节点的入度和出度至少为1,那么我们求出入度为零的节点数量和出度为零的节点数量,答案取最大值,因为在一个DAG中添加这么多边一定可以使这个图强连通。注意当这个图本身强连通时要特判一下,答案为零。 #in

GODSPEED 853

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

UVAlive4287_Proving Equivalences

题意是告诉你有n个命题,m条递推关系,表示某个命题可以推出另外一个命题。 现在问你至少在增加多少个递推关系可以保证所有命题两两互推。 命题为点,关系为有向边,题目转化成为至少增加多少条有向边使得整个图强连通。 首先对于有向图,求出所有的联通分量,并且将所有的联通分量缩成一个点,最终得出一个无环图。 在新图里,设有A个出度为0的点,B个入度为0的点,那么我们只要保证增加max(A,...

weixin_30802171的博客 86

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

UVALIVE 4287 Proving Equivalences Tarjan求强连通分量

题目链接:https://vjudge.net/problem/UVALive-4287题意:有n个命题,已知其中的m个推导,要证明n个命题全部等价(等价具有传递性),最少还需要做出几次推导解法:由已知的推导可以建一张无向图,则问题变成了最少需要增加几条边能使图变成强连通图。找出所有的强连通分量,将每一个连通分量视作一个大节点,则整张图变成了一张DAG。设出度为0的大节点个数为a,入度为0的大节点个

I good vegetable a! 428

Proving Equivalences UVALive - 4287(强连通分量 水题)

就是统计入度为0 的点 和 出度为0 的点 输出 大的那一个,, 若图中只有一个强连通分量 则输出0即可 和https://www.cnblogs.com/WTSRUVF/p/9301096.html 这题差不多 poj1236 #include <iostream> #include <cstdio> #include <sstream...

babing2770的博客 189

【UVALive】4287 Proving Equivalences 强连通分量

Consider the following exercise, found in a generic linear algebratextbook. Let A be an n × n matrix. Prove that the followingstatements are equivalent: A is invertible.Ax = b has exactly one solu

poursoul 937

UVAlive4287 Proving Equivalences(scc)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=10294   【思路】        强连通分量。        求出bcc后,缩点形成DAG,设DAG上入度为0的点数为a 出度为0的点数为b,则ans=max(a,b) (互相到达,首尾相接),需要注意scc数为1的时候ans=0。   【代码】  

hahalidaxin的专栏 223

UVALive 4287 - Proving Equivalences(强连通分量)

题目: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=72618#problem/C 题意: 给出n个节点的m条边的有向图,要求添加最少的边使得新的图强连通. 思路: 强连通的部分敲模版即可.找出强连通分量,将每一个强连通缩成点, 得到一个新的有向图,然后求出有a个节点的入度为0, b个节点的出度为0, 答案便是a, b的最大

Halo 643

uvaLive_4287_Proving Equivalences(缩点)

题意:就是给你一个有向图,问你至少添加多少条边,使得该图为强连通图。

一点也不二 974

UVALive - 4287 Proving Equivalences(强连通分量 + DAG)

题目大意:给出N个命题,要求你证明这N个命题的等价性比如有4个命题a,b,c,d,我们证明a<->b, b<->c,c<->d,每次证明都是双向的,因此一共用了6次推导 如果换成证明a->b,b->c,c->d,d->a,每次证明都是单向的,而只需4次就可以证明所有命题的等价性 现在给出M个命题证明,问还需要证明几个,才可以保证N个命题等价解题思路:命题的等价,就相当于证明点到点之间是互相连通。

静静地码 964

UVALive - 4287 Proving Equivalences (强连通分量)

链接 : http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=10294 题意 :  告诉你n个等价的命题 和m个关系 比如 (u,v)代表u可以推导出v, 问至少需要补充多少条边。 用强连通缩点成一张DAG。 #include #include #include #include #includ

__ElemenT 593

UVALive 4287 Proving Equivalences(强连通分量)

题目分析 这道题就是求一个图如果转化为一个强连通图,那么我们首先强连通缩点,然后整个图变成一个有向无环图,然后我们又知道强连通图所有节点的入度和出度都不为0,因此我们只需要求缩点之后的图的入度为0的点和出度为0的点的最大值即可。 #include <stack> #include <vector> #include <cstdio> #include <cstring> #include <io

你真的介意真的在乎真的想要真的渴望的话你一定能够做到 318

UVALive4287-- Proving Equivalences(SCC+Tarjan)

题目链接 题意:证明n个命题全部等价,已经给出m此推导,求至少还要几次推导才能完成整个证明。 思路:可以将命题看作结点,推导看作有向边,则本题就能转化为n个结点m条边的有向图。利用tarjan算法得到所有强连通分量,将这些强连通分量当作一个点,得到一个DAG。之后就可以求次数了。注意当强连通数量为1时,就代表着证明已经完成了。 代码: #include #incl

懒人一枚。 958

【 UVALive - 4287】Proving Equivalences (SCC缩点)

题意:   给出N个命题,要求你证明这N个命题的等价性   比如有4个命题a,b,c,d,我们证明a<->b, b<->c,c<->d,每次证明都是双向的,因此一共用了6次推导如果换成证明a->b,b->c,c->d,d->a,每次证明都是单向的,而只需4次就可以证明所有命题的等价性现在给出M个命题证明,问还需要证明几个...

weixin_30877493的博客 78
上一篇: UVALive - 5135 Mining Your Own Business
下一篇: UVA - 11324 The Largest Clique
rootial
博客等级 码龄15年 2粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值