UVALive-4287 Proving Equivalences 有向图的强连通分量+缩点
题意:有n个命题,已知其中的m个推导,要证明n个命题全部等价(等价具有传递性),最少还需要做出几次推导。
思路:由已知的推导可以建一张无向图,则问题变成了最少需要增加几条边能使图变成强连通图。找出所有的强连通分量,将每一个连通分量视作一个大节点,则整张图变成了一张DAG。设出度为0的大节点个数为b,入度为0的大节点个数为a,则答案就是max(a,b)。
- #include<iostream>
- #include<string>
- #include<algorithm>
- #include<cstdlib>
- #include<cstdio>
- #include<set>
- #include<map>
- #include<vector>
- #include<cstring>
- #include<stack>
- #include<cmath>
- #include<queue>
- #define clc(a,b) memset(a,b,sizeof(a))
- #include <bits/stdc++.h>
- using namespace std;
- #define LL long long
- const int maxn = ;
- const int inf=0x3f3f3f3f;
- const double pi=acos(-);
- int in[maxn],out[maxn];
- vector<int>G[maxn];
- int pre[maxn],lowlink[maxn],sccno[maxn],dfs_clock,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=;
- clc(sccno,);
- clc(pre,);
- for(int i=; i<n; i++)
- if(!pre[i])
- dfs(i);
- }
- int main()
- {
- int t,n,m;
- 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);
- for(int i=; i<=scc_cnt; i++)
- in[i]=out[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])
- in[sccno[v]]=out[sccno[u]]=;
- }
- }
- int a=,b=;
- for(int i=; i<=scc_cnt; i++)
- {
- if(!in[i])
- a++;
- if(!out[i])
- b++;
- }
- int ans=max(a,b);
- if(scc_cnt==)
- ans=;
- printf("%d\n",ans);
- }
- return ;
- }
UVALive-4287 Proving Equivalences 有向图的强连通分量+缩点的更多相关文章
- UVALive - 4287 - Proving Equivalences(强连通分量)
Problem UVALive - 4287 - Proving Equivalences Time Limit: 3000 mSec Problem Description Input Outp ...
- UVALIVE 4287 Proving Equivalences (强连通分量+缩点)
题意:给定一个图,问至少加入多少条边能够使这个图强连通. 思路:首先求出这个图的强连通分量.然后把每个强连通分量缩成一个点.那么这个图变成了一个DAG,求出全部点的入度和出度,由于强连通图中每个节点的 ...
- LA 4287 等价性证明(强连通分量缩点)
https://vjudge.net/problem/UVALive-4287 题意: 给出n个结点m条边的有向图,要求加尽量少的边,使得新图强连通. 思路:强连通分量缩点,然后统计缩点后的图的每个结 ...
- UVALive - 4287 Proving Equivalences
给定n个命题之间的已经证明的关系如 a b表示已经证明蕴含式a→b,要求还需要再作多少次证明使得所有的命题都是等价的.将每个命题看成一个点,已经证明的命题之间连一条边,问题转化为添加多少条单向边使得图 ...
- UVALive 4287 SCC-Tarjan 加边变成强连通分量
还是强连通分量的题目,但是这个题目不同的在于,问你最少要添加多少条有向边,使得整个图变成一个强连通分量 然后结论是,找到那些入度为0的点的数目 和 出度为0的点的数目,取其最大值即可,怎么证明嘛... ...
- UvaLive 4287 Proving Equivalences 强连通缩点
原题链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...
- UVALive 4287 Proving Equivalences(缩点)
等价性问题,给出的样例为 a->b的形式,问要实现全部等价(即任意两个可以互相推出),至少要加多少个形如 a->b的条件. 容易想到用强连通缩点,把已经实现等价的子图缩掉,最后剩余DAG. ...
- 训练指南 UVALive - 4287 (强连通分量+缩点)
layout: post title: 训练指南 UVALive - 4287 (强连通分量+缩点) author: "luowentaoaa" catalog: true mat ...
- HD2767Proving Equivalences(有向图强连通分量+缩点)
题目链接 题意:有n个节点的图,现在给出了m个边,问最小加多少边是的图是强连通的 分析:首先找到强连通分量,然后把每一个强连通分量缩成一个点,然后就得到了一个DAG.接下来,设有a个节点(每个节点对应 ...
随机推荐
- LocalContainerEntityManagerFactoryBean
http://doc.okbase.net/liuyitian/archive/109276.html
- CODEVS 1638 修复公路
题目描述 Description A地区在地震过后,连接所有村庄的公路都造成了损坏而无法通车.政府派人修复这些公路. 给出A地区的村庄数N,和公路数M,公路是双向的.并告诉你每条公路的连着哪两个村庄, ...
- gradient css
<!DOCTYPE html> <html> <head> <title></title> <script src="js/ ...
- 应该知道的25个非常有用的CSS技巧
在我们的前端CSS编码当中,经常要设置特殊的字体效果,边框圆角等等,还要考虑兼 容性的问题, CSS网页布局,说难,其实很简单.说它容易,往往有很多问题困扰着新 手,在中介绍了非常多的技巧,这些小技巧 ...
- Linux中crond服务与crontab用法
需要写个在Linux下定时更新系统的脚本,man crondtab 不甚详细,现将网络上的介绍列举如下: crontab是一个很方便的在unix/linux系统上定时(循环)执行某个任务的程序使用cr ...
- LibLinear(SVM包)使用说明之(三)实践
LibLinear(SVM包)使用说明之(三)实践 LibLinear(SVM包)使用说明之(三)实践 zouxy09@qq.com http://blog.csdn.net/zouxy09 我们在U ...
- zepto源码学习-05 ajax
学习zeptoajax之前需要先脑补下,强烈推荐此文http://www.cnblogs.com/heyuquan/archive/2013/05/13/js-jquery-ajax.html 还有A ...
- MongoDB开发应用实战
http://special.csdn.net/mongodb/ http://www.csdn.net/article/2011-03-21/294271 http://blog.itpub.net ...
- Altium Designer完美双屏显示方法演示
布线时我们往往需要对一些信号线做特别的走线处理,这样需要边布线边对照原理图,在protel99中那是一个很痛苦的事,在Altium Designer中这种情况将变很简单. 硬件要求,笔记本+外接显示器 ...
- 延时过程中要加上app.processEvents(),进度条里也要加上这句
如何让程序等待一段时间QTime t;t.start();while(t.elapsed()<1000);这种死循环也是一种常见错误用法.但改成正确的还是比较简单的: QTime t;t.sta ...