hdu2767 Proving Equivalences Tarjan缩点
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4343 Accepted Submission(s): 1541
Let A be an n × n matrix. Prove that the following statements are equivalent:
1. A is invertible.
2. Ax = b has exactly one solution for every n × 1 matrix b.
3. Ax = b is consistent for every n × 1 matrix b.
4. Ax = 0 has only the trivial solution x = 0.
The typical way to solve such an exercise is to show a series of implications. For instance, one can proceed by showing that (a) implies (b), that (b) implies (c), that (c) implies (d), and finally that (d) implies (a). These four implications show that the four statements are equivalent.
Another way would be to show that (a) is equivalent to (b) (by proving that (a) implies (b) and that (b) implies (a)), that (b) is equivalent to (c), and that (c) is equivalent to (d). However, this way requires proving six implications, which is clearly a lot more work than just proving four implications!
I have been given some similar tasks, and have already started proving some implications. Now I wonder, how many more implications do I have to prove? Can you help me determine this?
* One line containing two integers n (1 ≤ n ≤ 20000) and m (0 ≤ m ≤ 50000): the number of statements and the number of implications that have already been proved.
* m lines with two integers s1 and s2 (1 ≤ s1, s2 ≤ n and s1 ≠ s2) each, indicating that it has been proved that statement s1 implies statement s2.
* One line with the minimum number of additional implications that need to be proved in order to prove that all statements are equivalent.
- #include <bits/stdc++.h>
- using namespace std;
- const int N = 20005;
- const int M = 50005;
- struct edge {
- int v, next;
- edge() {}
- edge(int v, int next): v(v), next(next) {}
- }e[M], e2[M];
- int head[N], head2[N], num[N], in[N], out[N], tot, tot2;
- int low[N], dfn[N], Stack[N], belong[N];
- int scc, Index, top;
- bool Instack[N];
- void addedge(int u, int v, bool is) {
- if(is) {
- e[tot] = edge(v, head[u]);
- head[u] = tot++;
- }else {
- e2[tot2] = edge(v, head2[u]);
- head2[u] = tot2++;
- }
- }
- void Tarjan(int u) {
- int v;
- low[u] = dfn[u] = ++Index;
- Stack[top++] = u;
- Instack[u] = true;
- for(int i = head[u]; ~i; i = e[i].next) {
- v = e[i].v;
- if(!dfn[v]) {
- Tarjan(v);
- if(low[u] > low[v]) low[u] = low[v];
- }else if(Instack[v] && low[u] > dfn[v]) {
- low[u] = dfn[v];
- }
- }
- if(low[u] == dfn[u])
- {
- scc++;
- do {
- v = Stack[--top];
- Instack[v] = false;
- belong[v] = scc;
- num[scc]++;
- } while(v != u);
- }
- }
- void solve(int n)
- {
- memset(dfn, 0, sizeof dfn);
- memset(Instack, false, sizeof Instack);
- memset(num, 0, sizeof num);
- Index = scc = top = 0;
- for(int i = 1; i <= n; ++i) if(!dfn[i]) Tarjan(i);
- }
- void init() {
- tot = tot2 = 0;
- memset(head, -1, sizeof head);
- memset(head2, -1, sizeof head2);
- }
- int main()
- {
- int _; scanf("%d", &_);
- while(_ --)
- {
- init();
- int n, m, u, v;
- scanf("%d%d", &n, &m);
- for(int i = 1; i <= m ;++i) {
- scanf("%d%d", &u, &v);
- addedge(u, v, true);
- }
- solve(n);
- memset(in, 0, sizeof in);
- memset(out, 0, sizeof out);
- for(int u = 1; u <= n; ++u) {
- for(int i = head[u]; ~i; i = e[i].next) {
- int v = e[i].v;
- if(belong[u] != belong[v]) {
- addedge(belong[u], belong[v], false);
- }
- }
- }
- for(int u = 1; u <= scc; ++u) {
- for(int i = head2[u]; ~i; i = e2[i].next) {
- int v = e2[i].v;
- in[v]++;
- out[u]++;
- }
- }
- int a = 0, b = 0;
- for(int i = 1; i <= scc; ++i) {
- if(in[i] == 0) a++;
- if(out[i] == 0) b++;
- }
- printf("%d\n", scc == 1 ? 0 : max(a, b));
- }
- return 0;
- }
hdu2767 Proving Equivalences Tarjan缩点的更多相关文章
- HDU2767 Proving Equivalences(加边变为强联通图)
Proving Equivalences Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- HDU2767 Proving Equivalences
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...
- UVALive 4287 Proving Equivalences(缩点)
等价性问题,给出的样例为 a->b的形式,问要实现全部等价(即任意两个可以互相推出),至少要加多少个形如 a->b的条件. 容易想到用强连通缩点,把已经实现等价的子图缩掉,最后剩余DAG. ...
- hdu2767 Proving Equivalences --- 强连通
给一个图,问至少加入�多少条有向边能够使图变成强连通的. 原图是有环的,缩点建图,在该DAG图上我们能够发现,要使该图变成强连通图必须连成环 而加入�最少的边连成环,就是把图上入度为0和出度为0的点连 ...
- hdu 2767 Proving Equivalences 强连通缩点
给出n个命题,m个推导,问最少添加多少条推导,能够使全部命题都能等价(两两都能互推) 既给出有向图,最少加多少边,使得原图变成强连通. 首先强连通缩点,对于新图,每一个点都至少要有一条出去的边和一条进 ...
- UvaLive 4287 Proving Equivalences 强连通缩点
原题链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...
- HDU2767Proving Equivalences tarjan缩点,如何求入度和出度最大值
给定一个有向图,问最少增加多少条边后变成强连通图 tarjan求求强连通分量并缩点,如果强连通分量个数为1,则需要边数为0, 否则为缩点后点入度和出度的最大值, 证明:当入度或者出度不为0时 ...
- hdu2767 Proving Equivalences,有向图强联通,Kosaraju算法
点击打开链接 有向图强联通,Kosaraju算法 缩点后分别入度和出度为0的点的个数 answer = max(a, b); scc_cnt = 1; answer = 0 #include<c ...
- HDU 2767 Proving Equivalences (Tarjan)
Proving Equivalences Time Limit : 4000/2000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other ...
随机推荐
- 在没装VS2010的机器上运行VS2010开发的C++程序
在VS2010下写了一个win32控制台应用程序,编译ok.exe,需要依赖osg相关动态库 第一次编译的是Debug版本的,直接将ok.exe和osg相关dll文件拷贝到没有安装VS2010机器上运 ...
- 宠物收养所(bzoj1208)
Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收养被主人遗弃的宠物和让新的主人领养这些宠物.每个领养者都希望领养到自己满意的宠物,阿Q根据领养者的要求通过他自己发明的一个特 ...
- *** Assertion failure in -[UIApplication _runWithMainScene:transitionContext iOS9.1闪退问题解决
错误原因在于 AppDelegate 中 didFinishLaunchingWithOptions 结束前 未定义 rootViewController,Xcode7规定必须要有rootViewCo ...
- Xcode - 修改变量名、类名及字符串的替换操作
在做iOS开发代码优化的工作时,优化代码结构之前,我们应该先整理好工程的外貌,将文件和类的命名进行规范,在Xcode中为我们提供了方便而强大的名称修改功能. 第一步:修改类名 将鼠标点击放在类的名称上 ...
- iOS - property,strong,weak,retain,assign,copy,nomatic 的区别及使用
1:ARC环境下,strong代替retain.weak代替assign,xcode 4.2(ios sdk4.3和以下版本)和之前的版本使用的是retain和assign,是不支持ARC的.xcod ...
- ASP.NET的Cookie和Session
HTTP属于应用层,HTTP协议一共有五大特点:1.支持客户/服务器模式;2.简单快速;3.灵活;4.无连接;5.无状态. 无状态HTTP协议是无状态的协议.一旦数据交换完毕,客户端与服务器端的连接就 ...
- ASP.NET Web API 数据验证
第一种方式单独为每一个Action做验证 // POST api/values public HttpResponseMessage Post([FromBody]UserInfo userInfo) ...
- JAVA基础学习之IP简述使用、反射、正则表达式操作、网络爬虫、可变参数、了解和入门注解的应用、使用Eclipse的Debug功能(7)
1.IP简述使用//获取本地主机ip地址对象.InetAddress ip = InetAddress.getLocalHost();//获取其他主机的ip地址对象.ip = InetAddress. ...
- JAVA基础学习之final关键字、遍历集合、日期类对象的使用、Math类对象的使用、Runtime类对象的使用、时间对象Date(两个日期相减)(5)
1.final关键字和.net中的const关键字一样,是常量的修饰符,但是final还可以修饰类.方法.写法规范:常量所有字母都大写,多个单词中间用 "_"连接. 2.遍历集合A ...
- sdut 2449走迷宫【最简单的dfs应用】
走迷宫 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_ 题目描述 一个由n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m) ...