LA 4287 等价性证明
题目链接:http://vjudge.net/contest/141990#overview
题意是告诉你有n个命题,m条递推关系,表示某个命题可以推出另外一个命题。
现在问你至少在增加多少个递推关系可以保证所有命题两两互推。
把命题看成一个结点,推导看成有向边,就是n个结点,m 条有向边,要求添加尽量少的边,使得新图强连通。
首先找出强连通分量,把每个强连通分量缩成一个点,得到DAG。设有 a 个结点入度为 0 ,b 个结点出度为 0 ,max(a,b),就是答案。如下图:
入度为 0 的集合 为 1,出度为 0 的集合 为 2,要加两条红边才能 互相到达(强连通)。
先标记所有强连通图的入度出度 1 ,要是有点相同,标记为 0 ,统计 入度为 1 ,出度为 1 的个数。
如果原图只有一个强连通分量 ans = 0 不需要加边。
- #include <bits/stdc++.h>
- using namespace std;
- const int Maxn = + ;
- vector<int> G[Maxn];
- int pre[Maxn];
- int lowlink[Maxn];
- int sccno[Maxn];
- int dfs_clock;
- int scc_cnt;
- stack<int> S;
- void dfs(int u)
- {
- pre[u] = lowlink[u] = ++dfs_clock;
- S.push(u);
- for(int i=; 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)
- {
- dfs_clock = scc_cnt = ;
- memset(sccno,,sizeof(sccno));
- memset(pre,,sizeof(pre));
- for(int i=; i<n; i++)
- {
- if(!pre[i])
- dfs(i);
- }
- }
- int main()
- {
- int n,m;
- int t;
- scanf("%d",&t);
- while(t--)
- {
- scanf("%d%d",&n,&m);
- for(int i=; i<n; i++)
- G[i].clear();
- for(int i=; i<m; i++)
- {
- int u,v;
- scanf("%d%d",&u,&v);
- u--;
- v--;
- G[u].push_back(v);
- }
- find_scc(n);
- int in0[Maxn];
- int out0[Maxn];
- for(int i=; i<=scc_cnt; i++)
- {
- in0[i] = ;
- out0[i] = ;
- }
- for(int u=; u<n; u++)
- {
- for(int i=; i<G[u].size(); i++)
- {
- int v = G[u][i];
- if(sccno[u]!=sccno[v])
- {
- in0[sccno[v]] = ;
- out0[sccno[u]] = ;
- }
- }
- }
- int maxin = ,maxout = ;
- for(int i=; i<=scc_cnt; i++)
- {
- if(in0[i]) maxin ++;
- if(out0[i]) maxout ++;
- }
- int ans = max(maxin,maxout);
- if(scc_cnt==)
- puts("");
- else printf("%d\n",ans);
- }
- return ;
- }
LA 4287 等价性证明的更多相关文章
- LA 4287 等价性证明(强连通分量缩点)
https://vjudge.net/problem/UVALive-4287 题意: 给出n个结点m条边的有向图,要求加尽量少的边,使得新图强连通. 思路:强连通分量缩点,然后统计缩点后的图的每个结 ...
- 2020-BUAA OO-面向对象设计与构造-HW11中对ageVar采用缓存优化的等价性证明(包括溢出情况)
HW11中对ageVar采用缓存优化的等价性证明(包括溢出情况) 概要 我们知道,第三次作业里age上限变为2000,而如果缓存年龄的平方和,2000*2000*800 > 2147483647 ...
- DFA与NFA的等价性,DFA化简
等价性 对于每个NFA M存在一个DFA M',使得L(M)=L(M')--------等价性证明,NFA的确定化 假定NFA M=<S, Σ, δ, S 0 , F>,我们对M的状态转换 ...
- 【软件构造】第三章第五节 ADT和OOP中的等价性
第三章第五节 ADT和OOP中的等价性 在很多场景下,需要判定两个对象是否 “相等”,例如:判断某个Collection 中是否包含特定元素. ==和equals()有和区别?如何为自定义 ADT正确 ...
- NNs(Neural Networks,神经网络)和Polynomial Regression(多项式回归)等价性之思考,以及深度模型可解释性原理研究与案例
1. Main Point 0x1:行文框架 第二章:我们会分别介绍NNs神经网络和PR多项式回归各自的定义和应用场景. 第三章:讨论NNs和PR在数学公式上的等价性,NNs和PR是两个等价的理论方法 ...
- Java中测试对象的等价性
Java中用于测试对象的等价性有三个操作符:== , != 和 Equals() 对于基本类型即int,boolean, byte 等等来说,==和 != 比较的是 基本类型的内容,这和c.c++是一 ...
- Java中的equals和==的差别 以及Java中等价性和同一性的讨论
==对基本数据类型比较的是值,对引用类型比较的是地址 equals()比较的是对象的数据的引用 等价性原理: 自反性 x.equals(x)为true 对称性 x.equals(y) 为t ...
- 数据结构 《18》----RMQ 与 LCA 的等价性 (一)
前言 RMQ: 数组 a0, a1, a2,..., an-1, 中求随意区间 a[i+1], a[i+2], ..., a[i+k] 的最小值 LCA: 求二叉树中两个节点的最低公共 ...
- 【转】Eric's并发用户数估算与Little定律的等价性
转自:http://www.cnblogs.com/hundredsofyears/p/3360305.html 在国内性能测试的领域有一篇几乎被奉为大牛之作的经典文章,一个名叫Eric Man Wo ...
随机推荐
- Web安全学习笔记之一
浏览器基本策略:同源策略 同源策略规定:不同域的客户端脚本在没有明确授权的情况下,不能读写对方的资源. 同域与不同域:如http://www.text.com与https://www.text.com ...
- FineUi导出时禁用ajax即EnableAjax="false"出现问题的解决方法
fineui导出时会出现乱码, 在按钮上添加EnableAjax="false"属性禁用ajax就可以正常导出.但如果我在后台代码中直接return 而不进行导出流操作,则前台脚本 ...
- 无法分配超出32(XXX)的MINEXTENTS报错的解决方法
今天在创建新表的时候,遇到该报错:ORA-01659 无法分配超出32(XXX)的MINEXTENTS 解决方法:修改表空间大小. 命令如下: ALTER DATABASE DATAFILE ''D: ...
- sql 数据库 初级 个人学习总结(一)
数据库个人总结(初级)1.增删改查 insert into 表名 values ('条件','条件2') delete from 表名 where 条件 update 表名 set=条件值 where ...
- 下载包含src,tgz,zip的文件
下载哪一个文件? 含src的是源码文件,含tgz和zip的分别是linux和windows系统下jar包(java文件包) asc,md5,sha1是三种加密文件,可用于判断文件是否被修改. Ente ...
- 数据结构--树(遍历,红黑,B树)
平时接触树还比较少,写一篇博文来积累一下树的相关知识. 很早之前在数据结构里面学的树的遍历. 前序遍历:根节点->左子树->右子树 中序遍历:左子树->根节点->右子树 后序遍 ...
- 未找到arm-linux-gcc解决办法
sudo tar jxvf arm-linux-gcc.4.3.3.tar.bz2 export PATH=$PATH:/usr/local/arm/2.95.3/bin #/usr/local/ar ...
- 【iCore3 双核心板】例程十五:USB_CDC实验——高速数据传输
实验指导书及代码包下载: http://pan.baidu.com/s/1gemYjz9 iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
- 【iCore3 双核心板】例程十七:USB_MSC实验——读/写U盘(大容量存储器)
实验指导书及代码包下载: http://pan.baidu.com/s/1qXt1L0o iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...
- android NumberPicker 数组越界的坑
被这个问题耽误了一个多小时... 直接上解决方案,参考红色部分. private void initViews() { wheel = (NumberPicker) findViewById(R.id ...