Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4343    Accepted Submission(s): 1541

Problem Description
Consider the following exercise, found in a generic linear algebra textbook.

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?

 
Input
On the first line one positive number: the number of testcases, at most 100. After that per testcase:

* 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.

 
Output
Per testcase:

* One line with the minimum number of additional implications that need to be proved in order to prove that all statements are equivalent.

 
Sample Input
2
4 0
3 2
1 2
1 3
 
Sample Output
4
2
 
#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;
}

  

 
Source

hdu2767 Proving Equivalences Tarjan缩点的更多相关文章

  1. HDU2767 Proving Equivalences(加边变为强联通图)

    Proving Equivalences Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  2. HDU2767 Proving Equivalences

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  3. UVALive 4287 Proving Equivalences(缩点)

    等价性问题,给出的样例为 a->b的形式,问要实现全部等价(即任意两个可以互相推出),至少要加多少个形如 a->b的条件. 容易想到用强连通缩点,把已经实现等价的子图缩掉,最后剩余DAG. ...

  4. hdu2767 Proving Equivalences --- 强连通

    给一个图,问至少加入�多少条有向边能够使图变成强连通的. 原图是有环的,缩点建图,在该DAG图上我们能够发现,要使该图变成强连通图必须连成环 而加入�最少的边连成环,就是把图上入度为0和出度为0的点连 ...

  5. hdu 2767 Proving Equivalences 强连通缩点

    给出n个命题,m个推导,问最少添加多少条推导,能够使全部命题都能等价(两两都能互推) 既给出有向图,最少加多少边,使得原图变成强连通. 首先强连通缩点,对于新图,每一个点都至少要有一条出去的边和一条进 ...

  6. UvaLive 4287 Proving Equivalences 强连通缩点

    原题链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...

  7. HDU2767Proving Equivalences tarjan缩点,如何求入度和出度最大值

    给定一个有向图,问最少增加多少条边后变成强连通图    tarjan求求强连通分量并缩点,如果强连通分量个数为1,则需要边数为0,  否则为缩点后点入度和出度的最大值,  证明:当入度或者出度不为0时 ...

  8. hdu2767 Proving Equivalences,有向图强联通,Kosaraju算法

    点击打开链接 有向图强联通,Kosaraju算法 缩点后分别入度和出度为0的点的个数 answer = max(a, b); scc_cnt = 1; answer = 0 #include<c ...

  9. HDU 2767 Proving Equivalences (Tarjan)

    Proving Equivalences Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other ...

随机推荐

  1. grep(Global Regular Expression Print)

    .grep -iwr --color 'hellp' /home/weblogic/demo 或者 grep -iw --color 'hellp' /home/weblogic/demo/* (-i ...

  2. jQuery – 3.JQuery的Dom操作

    3.1 JQuery的Dom操作     1.使用html()方法读取或者设置元素的innerHTML    2.使用text()方法读取或者设置元素的innerText     3.使用attr() ...

  3. ASP.NET 客户端静态文件请求设置缓存(Client Cache)

    通常在服务器端大家都已经做了很多缓存的工作,ASP.NET CACHE也好MemeryCache也好却总是忽略了客户端缓存. 因为大家都知道不管哪个client都会缓存已经访问过的站点,但是浏览器缓存 ...

  4. Delphi编译dll时出错"Cannot debug project unless a host application is defined.use the run|parameters...dialog box."

    问题: 在编写DLL程序的时候,按下F9或者按下那个绿色的箭头,会报错,如下 原因: 是因为你按下的F9或者那个绿色箭头是表示“Run”这个程序,但是DLL不是可执行文件,所以当然不能够运行,所以就会 ...

  5. Pyqt 一个简单的浏览器

    使用QtWebKit 做一个简单的浏览器. mybrowserUI.ui <?xml version="1.0" encoding="UTF-8"?> ...

  6. 【转载】 JQuery.Gantt(甘特图) 开发指南

    转载来自: http://www.cnblogs.com/liusuqi/archive/2013/06/09/3129293.html JQuery.Gantt是一个开源的基于JQuery库的用于实 ...

  7. maven pom.xml示例

    示例说明: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3. ...

  8. MySQL5.7更改密码时出现ERROR 1054 (42S22): Unknown column 'password' in 'field list'

    转自:http://blog.csdn.net/u010603691/article/details/50379282 新安装的MySQL5.7,登录时提示密码错误,安装的时候并没有更改密码,后来通过 ...

  9. myeclipse+tomcat 工程名改名的问题 ——————完美解决方案

    当建好的工程再重命名之后,发布和访问的时候都还是原来的名字,这个问题纠结了我很久,最好找到解决方法,这里分享一下,希望大家不要再受这种困惑.解决方法: 点击工程右键->properties-&g ...

  10. 通信原理实践(五)——2PSK 与2DPSK 通信系统

    一.一些Matlab函数 二.2PSK调制解调,性能分析 1.2PSK调制 (1)图示 (2)Matlab代码 function [ s_t ,bb_t,bits] = psk2_module( nS ...