【题目链接】hdu-2767

【题目描述】

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?

【输入格式】

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.

【输出格式】

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.

【分析】

就是要求最少加多少条边可以使这个图变成强连通的。做完tarjan后,我们就找入度和出度为0的点,取最大值。

【代码】

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cctype>
#include <cmath>
#include <time.h> using namespace std; const int maxm=50010;
const int maxn=20010; struct Edge{
int to,next;
}edge[maxm<<1]; int nedge,sum,dep,top,n,m,cnt;
int head[maxn],dfn[maxn],stack[maxm],low[maxm],od[maxm],vis[maxm],id[maxm];
int belong[maxn]; inline int read()
{
int X=0,w=0; char ch=0;
while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
return w?-X:X;
} void tarjan(int u)
{
dfn[u]=low[u]=++dep;
stack[top++]=u;
vis[u]=1;
for (int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].to;
if (!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else
{
if (vis[v]) low[u]=min(low[u],dfn[v]);
}
}
int j;
if (dfn[u]==low[u])
{
sum++;
do{
j=stack[--top];
belong[j]=sum;
vis[j]=0;
}while (u!=j);
}
} void add_edge(int a,int b)
{
edge[nedge]=(Edge){b,head[a]}; head[a]=nedge++;
} int main()
{
int cas=read();
while (cas--)
{
nedge=0;
memset(head,-1,sizeof(head));
memset(dfn,0,sizeof(dfn));
memset(od,0,sizeof(od));
memset(id,0,sizeof(id));
memset(vis,0,sizeof(vis));
memset(belong,0,sizeof(belong));
sum=0,dep=0,top=0,cnt=0;
n=read(),m=read();
for (int i=1;i<=m;i++)
{
int a=read(),b=read();
add_edge(a,b);
}
for (int i=1;i<=n;i++)
{
if (!dfn[i]) tarjan(i);
}
if (sum==1)
{
printf("0\n");
}
else
{
for (int i=1;i<=n;i++)
{
for (int j=head[i];j!=-1;j=edge[j].next)
{
int v=edge[j].to;
if (belong[i]!=belong[v]) od[belong[i]]++,id[belong[v]]++;
}
}
int idnum=0,odnum=0;
for (int i=1;i<=sum;i++)
{
if (id[i]==0) idnum++;
if (od[i]==0) odnum++;
}
int ans=max(idnum,odnum);
printf("%d\n",ans);
}
}
return 0;
}

最新文章

  1. 删除 TOMCAT 上次关闭遗留下来的 SESSION 缓存
  2. 关于H.264 x264 h264 AVC1
  3. 复习-C语言内嵌汇编-初级(2)
  4. BZOJ 1579: [Usaco2009 Feb]Revamping Trails 道路升级( 最短路 )
  5. c++,类的组合
  6. dict、defaultdict 和 OrderedDict 比较
  7. 【Java每日一题】20170119
  8. Django--CRM--QueryDict, 模糊搜索, 加行级锁
  9. ubuntu 网络配置
  10. JEECG-Swagger UI的使用说明
  11. javascript进阶笔记(3)
  12. 【Codechef】BB-Billboards
  13. 【转】对 Rust 语言的分析
  14. 检测硬件RDMA卡是否存在
  15. HDU 2102 A计划 (深搜)
  16. sklearn的train_test_split,果然很好用啊!
  17. Dubbo源代码实现三:注册中心Registry
  18. RF上传图片各种失败坑,使用pywin32来操作windows窗体
  19. WinForm下的Nhibernate+Spring.Net的框架配置文件
  20. c++多线程编程(三)

热门文章

  1. Linux学习笔记:linux命令之目录处理命令
  2. Spring Cloud04: RestTemplate的使用
  3. Handler_read_*的总结
  4. Eclipse安装Pydev插件时所遇到的问题
  5. klayout安装及使用教程
  6. 题解 P3232 [HNOI2013]游走
  7. WPF中选择文件和选择文件夹的方法
  8. 初学springboot
  9. MaterialDesignInXamlToolkit“无法绑定到目标方法,因其签名或安全透明度与委托类型的签名或安全透明度不兼容”异常的解决思路
  10. 解决Git操作报错