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 ...
随机推荐
- 将文件系统数据库迁移到ASM中
使用裸设备配置ASM实例 http://www.cnblogs.com/myrunning/p/4270849.html 1.查看我们创建的磁盘组 [oracle@std ~]$ export ORA ...
- VS 调试
Vs 单步调试 在vs中的单步调试: 调试重要的几个键: F9在当前光标所在的行下断点,如果当前行已经有断点,则取消断点. F5调试状态运行程序,程序执行到有断点的地方会停下来. F10单步执行程序. ...
- Android课程---Android Studio安装及使用
2013年Google I/O 大会首次发布了Android Studio IDE(Android平台集成开发环境).它基于Intellij IDEA 开发环境,旨在取代Eclipse和ADT(And ...
- 用Scala实现集合中相邻元素间的差值
欢迎转载,转载请注明出处,徽沪一郎. 概要 代码这东西,不写肯定不行,新学Scala不久,将实际遇到的一些问题记录下来,日后也好查找. 今天讲的是如何计算同一集合中元素两两之间的差值,即求开始集合(a ...
- freemarker判断对象是否为空
freemarker中显示某对象使用 ${name}. 但如果name为null,freemarker就会报错.如果需要判断对象是否为空: <#if name??> …… </# ...
- Mac系统安装jdk和maven
一.安装jdk 1.查看java链接到了哪里: 进入到相应的目录:cd /usr/bin 查看java链接到了哪里: ls -l java lrwxr-xr-x 1 root wheel 74 ...
- Android 自定义RecyclerView 实现真正的Gallery效果
http://blog.csdn.net/lmj623565791/article/details/38173061
- elasticsearch使用操作部分
本片文章记录了elasticsearch概念.特点.集群.插件.API使用方法. 1.elasticsearch的概念及特点.概念:elasticsearch是一个基于lucene的搜索服务器.luc ...
- java 向上转型 向下转型
//父类 四边形 class Quadrangle{ public static void draw (Quadrangle q){ } } //子类 public class Parallelog ...
- Android的onMeasure和onLayout And MeasureSpec揭秘
Android中自定义ViewGroup最重要的就是onMeasure和onLayout方法,都需要重写这两个方法,ViewGroup绘制 的过程是这样的:onMeasure → onLayout → ...